cncml手绘网
标题:
rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
[打印本页]
作者:
admin
时间:
2022-10-26 00:48
标题:
rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
+ U3 g# L/ n( n Z' c% `6 B
6 P& n" q( ], o& g5 Y, j4 o
一、数据插入 - INSERT
2 k4 [% _2 K z7 j
) n; s" K. g4 `0 r5 M
1.1 : DLang 插入数据
: i/ m z8 g- Z9 y& [" ~
# g& n# g7 Z3 Q! q1 T4 ^
import std.stdio;
: U4 F! P" `7 v; j7 ]+ I. t
( X5 X" ~, s' D/ [
import hunt.database;
+ ^; O5 g l1 V' Y" E
8 K+ i \, L# H, l8 W
void main()
" n) [* r. R$ J) P% L
2 p1 H; u& K J4 O `, h" M& Z
{
: H! X- ]& m. Q" L( w( u
* Z# P5 D0 ]4 F- l
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
( Y5 G7 l; B5 k# I
" [ v) D, X, f+ E4 q0 k1 T, M7 F
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
3 f" B% P/ N$ [' {, k8 V/ D
4 X3 j3 W2 y+ X' n; o& d& n' o
// 打印插入数量
8 q, g' K4 i1 W+ P( Z
4 r& k* j3 E2 |6 [( u
writeln(result);
# Q- s" v" X3 D) u
/ Y q7 D$ f- J) W7 W8 t
db.close();
6 Y; W# Q# A! C7 n9 e& g" `7 W
3 v, [ U2 C9 V4 g( n" O
}
) w$ F; n* l* m! d* D4 N! k
( |% K* C4 E! @" ?3 k Q) r
1.2 : Rust 插入数据
3 M' n, d! p$ M; B
. d; B0 b# z6 ?! |
extern crate postgres;
1 ^6 H% K% J( e0 l
/ Q& F' [( K" E. A0 Q
use postgres::{Connection, SslMode};
# ~" r% p) |: O6 u: c# Q! v
' x/ q1 x2 ?" G2 C; j2 m- U) x- e
fn main() {
O/ f5 `$ N! r; P8 A( r8 Y
" M' P; U8 t/ I) t" F9 e6 o
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 A1 @# \' b2 G" F
0 ]) Q3 p, C7 t: @1 f9 f& H
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
( v' H( l& E C9 G
. |+ f h. ^/ V+ [5 h9 l3 N( z) p
}
$ ]% P+ z9 k/ o# X- K
" c9 y2 u; t Z1 a5 T8 f4 |
1.3 : Golang 插入数据
2 z% z/ `* {: `& V# w% ?% o
! I7 ?* q. t5 x4 T M; l
import (
3 I; d- ]" ?- s1 p" U7 M7 y) G
: e% u3 S/ {5 m8 I- \& F6 n# D
"database/sql"
# @, Q3 R" d% d; b3 B
9 J1 K$ I$ w3 A
"fmt"
6 a0 V1 \4 h5 T; ~8 W* B" \8 k9 C
( Q( A1 U( Y9 N" A% [) Y- x. r. T
_ "github.com/lib/pq"
! Q6 ~. Z7 _% u) v* g' w1 B7 g4 `
' ^1 `+ R; n/ o6 N3 s3 D* G
"time"
) a; C" j" u6 k7 A z, o
' r' k6 O# q: L* X) H
"log"
; G _' u' _- p* W+ h7 J! V
- F; {( X2 [* e) d
)
, {. Q; W' Y* b# G
0 m5 O0 n3 m$ A4 h- l
func main() {
* s2 T6 |8 U4 @8 i
! `# J$ c0 n4 h2 @* E
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, N) q, v& N$ D8 \: K; H- F
: \/ p+ q6 N8 x: F" G
if err != nil {
, g; r/ A0 a& y% \ G" I0 y
+ I- D8 V% ^4 k% k5 Q
log.Fatal(err)
3 R. ]5 v6 O' J' N
. B/ c9 [" o' k7 h, A, U
return nil
, f# l$ e1 T$ p' F3 A6 ?1 p- Y
! m3 X* o9 E' {( B0 a
}
8 m4 o) n. }+ l. W
9 v1 A. l9 ^$ E9 n
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
6 O/ M% q' @' Y+ c% f% W# R
9 L/ i4 r3 P2 W/ L8 z( M) G- l
stmt.Exec()
( n. l7 X) _8 R. C) {4 }$ E
* e& N% y# G7 ^& W+ K+ t- i- b1 O
stmt.Close()
" O( [: p# P/ o* ~0 f1 G$ O: m
/ s+ ?1 i# c5 T+ L9 O. a
}
P6 n: _" G7 E u# ~9 A$ x
. s' _: S; [. |. y& ^; |
二、数据查询 - SELECT
/ G" q3 r4 J0 g" S
* D0 B* _9 F, w; d* g# B
2.1 : DLang 查询数据
0 p- w* P9 }5 f" _' H0 V" I' u
: C& @' ]9 R: N& U, }1 v
import std.stdio;
6 M' T* d' K9 X% d, x m
2 I7 T5 T, O- D2 l s9 \* Q
import hunt.database;
5 G! ^9 J* x4 E" w& \2 i* |
% B( f) Q+ _9 |- ?# R, Z1 Y- G) X
void main()
3 b5 Z, e& A& p2 a- y, I
2 Y% X9 ?/ C3 u) e# \
{
/ r, q: H2 ^: O- y [* p
: b: B6 m* Y% O [ b( a
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 ?4 D1 v5 G3 F# ~
3 S( S) R$ e0 [% H2 j2 Q$ ]
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
9 |4 p! ~. _8 b; ?5 z' C5 `
5 ]/ W. t1 h6 F7 [
{
' J; }/ F5 s, W1 d: o: O+ p: N
" R. U: {8 v8 s: e5 O' }
writeln(row["username"]);
# Y9 ]0 R. i. h, m/ [# L* t
; @3 R+ k4 l* j$ A0 E+ N
}
) p8 G, o& K h/ K9 f
$ j6 T' b( X$ U6 a; V
db.close();
5 A E7 ]$ s4 F; j; g5 g, a' c
b2 W1 S# m& b
}
! l( F* w1 [. b# v0 n3 w/ o* J% c" Q" p
" M6 j# H! ]; n
2.2 : Rust 查询数据
: X+ V& J6 J2 |# z p
% ?* p Q- ~5 W
extern crate postgres;
* Q' _2 G, k' Y% I; \
8 J" p: @9 \9 }# w
use postgres::{Connection, SslMode};
# z# H' v( ?- j" _1 ^# L0 r
3 k6 g( z5 Q7 w
fn main() {
, G9 i9 [1 {6 r. E/ g9 ]5 \, N8 m6 e
* V! N: D9 u$ k( A/ I5 q; e* J
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
, `" ]' C* d3 B& m! X' |+ ^& z
: i0 |; h% o5 \0 d q. m, b
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
7 g1 w" z+ W; O9 @% I! q5 O1 T
8 |! O% S& S2 L' P2 e- N8 K0 U
println!("Found person {}", row.get(0));
* i, x% `% w. Y9 ~7 Q% l! p
z! M& t! x" u7 p# p8 A7 a" i
}
# @2 l+ {2 G& M3 b! t
# g: S6 t) s' Z& M
}
2 m* x: ]- p2 N! e! K
. V' R0 u1 Q; v* k' A7 X
2.3 : Golang 查询数据
' h7 f" ?; v4 H5 O/ `# b
# S0 L- |/ [# b1 I
import (
' |: B4 _! s! P. ]* [2 `
4 p' w* [* ]" a$ }. u" R) t) p
"database/sql"
/ H }8 u5 @, B' e9 @0 n4 w
- K- y3 W* |" }! D ?* k2 a
"fmt"
3 p X, y% p- `/ w
6 A; G6 }; O4 e! }& D; @
_ "github.com/lib/pq"
2 o7 o, s' j8 k; h* t
+ d' ] I' J, p# t. @" D, x
"time"
9 O9 f3 c9 Y' B3 |7 N" A. l0 T' D
6 l9 J: C* _9 N1 R
"log"
2 h: _( P m8 _! r
3 G( d0 ?! z* T) I
)
3 ~# U# T, k; g3 ?/ k: f* @7 m
1 n5 N* I- N6 _% K9 V
type User struct {
6 s* ]( [1 y/ D; E
: h: Q1 j' V- Z7 B0 ~( ]$ ?# X
UserName string
! {% E& C* q6 |. x/ W" R! e4 V
1 A: r9 ?5 ~2 p1 E# y5 }7 [
}
9 Q X% Y; q% @& O6 \
1 ]3 R& ]6 m$ D* V D
func main() {
# O3 | w3 g+ T9 _+ T# `$ n
k" U/ e- H( a8 S3 |6 ?
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 y) [$ E& N: G) x3 b
" e. V8 U& _8 \+ O! W# z
if err != nil {
" c1 e- f, C+ Y3 H: R9 n$ T5 S
5 S2 q( v* W( t8 z% T
log.Fatal(err)
" N+ w4 M5 t% z+ d$ g, r
" z9 R( Y, M& w+ e% t# i
return nil
% V8 v! z3 ^$ O, r" `3 F2 |2 C
- T+ j( J2 L- n' a8 B: u4 m
}
0 j0 l5 F- i' {
/ N5 ?; x( r: a. \2 G# v
user := User{}
2 ~. S# {6 E6 m- N3 k, x6 ?5 H
; Y6 A; b( _* N) J
stmt := db.Query("SELECT * FROM user")
5 Z2 [' |- k; m
. z2 g2 S6 |5 a5 ?
for rows.Next() {
% r, T: \! J! D& ^9 }7 p: L+ A
# r1 i! K! N% ^) U P& y
rows.Scan(&user.UserName)
9 l) H/ ?. @- Q2 t( Y
* {2 f6 M( c: N4 v) h
fmt.Println(user.UserName)
, L; K6 @; _; u, z
: v( @$ u. ?. t% e4 `: M
}
4 p: R/ P; s+ x. {( P/ h/ o5 Q
$ N7 f# {3 j# w8 ^
stmt.Close()
# E$ Y$ H/ m0 ]# w* q
% J y, ]1 B, _/ r
}
; ]7 V# _1 @3 C+ j, `
7 M3 Y) U4 u& [% N, I! ]; e- H r
三、总结
* f) \8 d; P, r S) S
J$ }4 C4 ~' f! w# b$ ^( n4 ^
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
8 F5 K( B. y9 O* p
! v0 @# ]. c* {! w! Z0 _& b
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
# x5 v1 e1 a$ m! b* ^
6 @2 W$ `# C# l8 c6 C5 k
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
" w l# M, Y7 t/ k: g; {/ [; s
. t' S' E9 B+ e" E# K: n% r* X4 c
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
H6 H$ ^4 d- a# L- y% E
————————————————
. x. i# p2 y4 i. _6 q
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 N! @+ s! L/ g! A, W
原文链接:
https://blog.csdn.net/weixin_30713705/article/details/113633961
: X) Q8 v' l7 F: d8 q
! {6 C7 [# \( A& W' s
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2