cncml手绘网

标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式 [打印本页]

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。# M+ c( f9 z, x/ {2 J/ u* p

2 j7 ~2 S, I3 L. [: u一、数据插入 - INSERT
4 h9 Z8 A% Z1 V+ a1 ]* p& i, }+ l) E
1.1 : DLang 插入数据
) O' ~6 g/ J: P
5 G6 X8 L% B9 n* fimport std.stdio;" X$ d; B& [4 d  J. x) o) Y
- l* t: W5 ?, O; m
import hunt.database;
2 S( \( v* J1 O, y; J! j# O" [  F# U# v: ?# T0 p, k: U
void main()' e) l# H) p+ E1 L9 F& B! t8 Q

. N6 b( F. a' S. Q  P; ^% g* r{
- g8 J2 }  o9 `/ I) b3 N, W4 ]
' k/ i% J7 A; @" N; K# xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 b) r5 H  I- P4 r! b% z, t4 h' @; i% m& F5 {& N, X0 t7 h4 i
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);, b* W$ \) r" M( [- T

8 {* N# e# G' c6 o5 b# B* w// 打印插入数量1 c1 L( ~1 g4 N! e6 `
7 ?$ W4 d6 t) C& L
writeln(result);
  h  O! v1 u6 x" i$ V( j) J9 p5 _3 j. {) J! H/ x6 L0 p) `# _
db.close();
& Q1 _, n: W# d* n; t( ~- {+ ~7 e- r1 d8 C( n# I, C7 J" n  G0 M
}# z% W9 _. h! R% E
( ?" d6 s" ~: b) s
1.2 : Rust 插入数据
( [8 p# X: S; A  ~! u
1 I  ~0 G$ M6 E5 ~$ pextern crate postgres;
/ d) `7 q7 l3 V( b+ h4 h" _! r
' I' r+ s( Z/ h% Luse postgres::{Connection, SslMode};' j' I/ L6 D* P/ \" i% }

7 e) k0 ]5 ]' E+ x% J. dfn main() {
  z$ G6 p1 w( |* V; s  x/ O7 z8 o  _4 L
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
. v! f) Z, F# s* e
9 @' m; j  g1 u! N, [1 sconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();; b( X/ M! R6 e
: X) p* Q: ^  `  j, r  J4 M, ^2 M
}! e  U: O! q% Y- H3 x. ^9 ~9 ?

) j# `; ~0 r2 y( p1.3 : Golang 插入数据% a( t2 l8 t/ e" a1 C) @7 y

1 a1 I! E  h8 ?4 d& Qimport (
4 D! U' L7 S' J: _
4 ^9 a/ B( P: A- l  k7 ?"database/sql"
- W$ U! I7 d0 L6 T. W+ a7 P/ |* U2 ~- O+ r0 h: e- w' ?
"fmt"2 n6 \' H# q- D) l% P. Y
$ Q/ z# t* m, f/ c
_ "github.com/lib/pq"2 O8 @0 A( Q: Y" V9 j: }+ C2 s' S
* \+ m% {) N4 Y0 P/ ^  A) R. ]: f% g
"time"
* R3 {5 {$ K8 g# J6 l) S
" t! L) V8 ~5 [# z+ c  k6 k"log"
8 a, P" A3 [$ Y0 D. h& n: A, E4 @3 }) S9 h+ Z
)0 s( I) v* T8 ?0 Y- F- u8 q& D' d& }

! R& \/ H7 a7 J: J5 w# `func main() {. N- {+ e* C7 N

* ^3 g$ z& e3 ?db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 _3 J  u7 g/ `/ l$ Z( ~
) Y/ A9 J" l! z! r" wif err != nil {( _9 s3 g! H. ~7 v

- r/ z6 q7 I7 A+ k& ~! r- wlog.Fatal(err)8 ~! U, b7 B0 j
# O2 q4 |8 z3 O- b& D) c5 m) o6 D
return nil
7 a& e& W$ Y  n6 W' m' `+ d
3 `! N; Y4 b6 Y/ y}
1 W- B' t' x1 c
1 T% {4 c* O  I& q3 q) S! Istmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")"); j" B: k7 ]8 e0 z* j

4 G6 `* m2 R1 y  q8 {' `stmt.Exec()
- ], j% g& D# j3 h, Q/ x& E2 ~6 O8 x3 D8 w7 \- L) x  w
stmt.Close()% M# H( _% r! {* i0 X6 [. U
/ D, \2 d- l+ S# k3 j2 v0 f
}' O* }4 N5 b7 W
! m5 Z1 ]) v8 z& _$ M! T3 A  k
二、数据查询 - SELECT
1 }% t0 B) k4 t$ E% B! v' g
8 }( J0 j$ x( q" J2.1 : DLang 查询数据
" O+ ~; L1 ^9 G; Q3 F& ?7 B& b" l" H
import std.stdio;, T% o! Q( Z7 B, o
" J, F$ Z' u( t+ Y  F% e% F
import hunt.database;
  U$ C  b% }" K+ M- ^- a4 v/ E0 A# T% g; O' l0 f% c9 R5 V
void main()4 c* {+ _0 {7 m1 v

3 x- L& ^1 y. ]6 @' i2 ?{! `( a5 m$ G, l* R) d7 Y( V3 r

! b/ c; P$ U0 q7 o8 Oauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- Z3 Y/ A* P! H- k' X

( `! G9 B# e4 H  Oforeach(row; db.query("SELECT * FROM user LIMIT 10"))
- Q1 W( j: H0 D$ C# m7 s2 z0 F/ f' X9 j# _) {. N) h" `5 Z
{: z3 K3 U0 f! \: S- r1 g

: V) ]$ k6 U# P1 Y$ g! E: V  Jwriteln(row["username"]);
# T& V0 I( H# v" }/ W9 S) J! N( u- i6 J7 Q6 `- d9 z
}
$ q' N* \3 ?  L& l" b- ?3 A8 s; U( r% a$ T: Y
db.close();
# A; r) l0 q7 z. J8 _
& R5 u8 A) x, y* p3 b}
7 |( l; E2 |; ]  [2 H' I+ N0 h) X3 w. n! @2 l$ V+ A& H- t# ^' U) }& t% e
2.2 : Rust 查询数据; \8 u1 @& [" J# O2 _

) i: A% X# n4 P5 {7 K6 [. v4 Q, K. Cextern crate postgres;) n; M% P4 ?1 {/ ]
5 z" h; X5 [* N6 f( y) L
use postgres::{Connection, SslMode};
' Q' y6 Z( ~+ {7 w' ~+ d  N; T1 d/ ?2 \# J+ G: j# o% p
fn main() {
5 X1 q  |8 A/ A3 D1 Q9 q; ~3 @# Q
- O8 A' T( X' d. {- flet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();" d( j; S! N' T7 I7 h
- W, K* D& E3 h6 s9 C
for row in &conn.query("SELECT * FROM user", &[]).unwrap();9 x1 g( ]$ `/ T. @- {
( B! P" w( Y: Q/ x, m# p
println!("Found person {}", row.get(0));4 O0 K! C8 ?! p; X: n

1 d* V& a0 Z$ z6 n  j" w}
( X( m( z! n1 B5 p7 Y% {; O
* X% d  S0 k* C; M/ X# z}2 `( s& N% j0 o8 N- o: Z; f# s

1 J! C0 U7 c" H0 o' V% |6 _$ r2.3 : Golang 查询数据* ]. G9 G3 J% w+ C# z) N6 f' c0 @

: _  C' B$ J$ p0 t: g6 t: Mimport (
" D( m# O" W+ f3 D0 a
0 E  S' ^! H6 U5 p0 t8 \"database/sql"
2 {% P# {7 i% b+ c4 V' l0 ^
0 ^! ^0 \' u3 S0 V' c7 d"fmt"$ ~& }; o! Q! Z4 \1 U" a
4 E4 S4 r3 t1 P/ P1 W1 `: o3 K
_ "github.com/lib/pq"
8 t- q) h& V% ^0 ]) f5 `. @, Z2 ^1 w9 u
"time"; I- p7 {1 C8 G- |6 y
# y% H8 O$ Y* x: ^
"log"
, E) r  }" g" E7 m7 b
) V  g7 }1 M6 G" V4 [9 Y) l)
/ _2 y; A! E8 ]; J
9 b# d7 Z$ i4 o# X8 jtype User struct {
$ E6 P, X/ L$ ~' s( l
; I' l0 d& V) W+ e4 D9 {8 RUserName string
. t3 g. C' X5 f, O0 N# ]
0 ^9 a1 v/ r9 s' N/ g: ?}
# x  j- X7 S- m# Y* M& e3 ]' K
6 f5 ]! q+ p2 T: X$ g% ?  x. M  ~func main() {. g$ c2 K2 L2 r. C/ |

. |& r3 C/ W% @4 ~7 {% t1 n1 Tdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: x' l  F: n; G; k
# L) O% j( ?. i; [6 n1 x+ Y' Uif err != nil {+ K# h1 Z( O( @) ]
6 O! d) W5 w" f0 ^
log.Fatal(err)2 B+ @1 f* A1 S: h

2 C& C' |4 I, v2 r; b3 R3 areturn nil
  P% o4 C& \- f7 l$ S4 X" D$ `: k! H
}- N, t9 E" `" Y7 k. ?' r8 N
5 A. p0 m. K7 |. E9 |3 v  }: P' i
user := User{}$ R5 B9 ^5 @& Z( @

8 x5 |7 s, U% gstmt := db.Query("SELECT * FROM user")- v/ d2 h% Q; v+ a0 ^4 X
: g9 i! B& V* n) E
for rows.Next() {- B! m' d+ k3 x; C" d1 ^
( R: D4 g, }& L7 I- ^7 _8 y
rows.Scan(&user.UserName)4 P/ B* R/ s) M% q- D' }9 P
  s1 w4 _' a! Z- a0 R# \- q
fmt.Println(user.UserName)$ J1 K8 w5 y9 _1 h7 P9 U

  F+ [$ T2 @0 T& }5 E}
0 S9 Z% y$ ^) h6 m; m. z/ ]9 W- a: c( a
stmt.Close()2 r2 F7 W1 Y# ]7 o: Q+ [) p
6 T; F" K/ G# f% Q( v
}$ H4 v/ Z5 X) Y

; {: ]7 D/ r" k" x0 n& C6 F& ^& e0 s三、总结. A! T. s+ R' F% D! S' f6 g

4 m' `6 ^# R! q& ~  s* b: N, ?& L对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。( c2 @$ a4 ~# h3 B) o0 C1 r# M

6 ?* W; E: D0 ^( U& R这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)/ c; W' `0 M! r4 R. V; d( Y

! d/ |) K$ L% |6 o4 r0 y; P: D/ e在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。0 V5 K  T, f3 s

+ Q9 @% s2 G3 U& v总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。/ [1 D8 h# S. w
————————————————6 W, B5 \/ s5 J& j! Y! b
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 t- ?. x( U! F' D
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
) Z5 S4 X; X" n- U1 K+ ?  O) h- t# V3 g* F5 |





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2