您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2347|回复: 0
打印 上一主题 下一主题

[rust] rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。# M' \0 p" y" E6 i! I6 A" y7 I

$ G& ^4 G) [3 O) v3 A8 _一、数据插入 - INSERT
7 l* {5 Z0 i1 a$ P
9 h  [" K+ Q$ n8 Z8 r! C1.1 : DLang 插入数据
9 o8 i3 G. L8 C6 m+ n
1 t1 k& X  N) a) M* h8 ?. Cimport std.stdio;
$ p% `; U7 C& ^6 l, P4 _3 J: ]/ J. L* |
import hunt.database;
) R# m7 B# c) ~5 u' P0 n
2 q6 d, N2 P1 w  t$ ~5 |& ?void main()
* t3 K0 l# \/ @% a5 ~# u9 T* C3 a  L1 y+ W. ]8 M" Y, J/ U
{0 I2 P! W9 ]2 A  V

5 r0 W7 m0 z2 D1 y: }. o' Sauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 g2 ]9 x3 A7 q. {, P8 ^

3 S% y) I) z& W+ @% f$ |) N5 Dint result = db.execute(`INSERT INTO user(username) VALUES("test")`);8 G1 q# e4 V+ T9 c& V3 e  V

3 C! }4 h' `" J2 t; ?5 y1 a! U// 打印插入数量
/ z/ E9 y0 E$ @5 I* b: ]
* N9 i" H8 a/ z4 Y: W. s6 Ewriteln(result);
2 V2 B) l  q; B6 `/ p/ S
( G3 `- p2 F# J7 K3 D4 @: O7 ]9 adb.close();
  v! ?& D/ H" R, \
3 w0 H2 a- ~7 I& T9 q( K1 ~5 a4 l}
& E( }, x; ~4 b* z) w0 _4 g
, k7 W! r/ L8 D( C/ {2 U1 k1.2 : Rust 插入数据
  s; \; Q4 y0 F0 v, T1 S# @" c% N4 j" X" G) F
extern crate postgres;
/ B% E/ k* m7 D. v2 ^5 X0 Y* C! ^2 b' Z. I
use postgres::{Connection, SslMode};
& R% Q. m. K! S! @4 }: r' O
4 l8 D; R8 H9 Lfn main() {& H( g3 p1 d( f4 `

. _, X/ t# d$ }9 u. ylet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();# F) s. z, s( k

# E2 l' f* W& P) a7 g2 |) Xconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' O8 s7 ^, k6 R4 G7 W8 f9 s4 D& f& n* l$ ]0 ?
}
: t( H  z& w3 T, G6 g- }
8 B: P$ L0 x% t% V" C" n$ i! `1.3 : Golang 插入数据: v0 }& `! K7 j- ]
  N, s2 w: l& ^; Y6 E. ~+ Q+ X
import (
. h0 F( H% E- h* k8 x5 ~# }* I1 `7 T2 u' _+ s& j
"database/sql"
6 {: \6 p3 _0 x! z, [- s) ]& k6 F) ?/ z9 ?
"fmt"
, E/ m+ ~* j* h# d3 P3 ]
( [5 E2 W) a/ P( L  `- A_ "github.com/lib/pq"9 h3 ?- l& i! {' h& Q
  _. g8 S1 H: ~0 g4 G, I/ @+ w
"time"$ A5 f+ h; Y7 p) V. `1 p
7 I( v7 W" v/ S: g. r/ |$ ^; a; v2 ]" c. ~
"log"2 T! ]- @; r/ J9 T6 E3 m) y
( C4 R5 M7 G" f4 q' ~6 P6 f  ?
)
6 u/ V# |+ J/ y% P
6 E* w( P  i3 k8 C3 Mfunc main() {
( ^0 c8 A3 h: j! t) d
$ P% `$ I8 P/ y2 k" ^+ ?, Y4 C" jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")) X5 p$ q# ~* _9 ?- {0 j

9 _; }/ |+ v, K  L  V& p9 a: fif err != nil {2 J* P) a$ K3 A9 Q5 q6 _1 d
0 `+ Y% d# r; Z. F0 _/ W
log.Fatal(err)
) _' ^/ \. _" n/ h- ^$ H( t7 }5 x2 W/ V/ ]/ b6 d" t2 |: ~
return nil
1 j: i6 P" k6 w7 x9 \* r
3 h* r1 y0 Y( j, }7 W* J, M2 [}; K+ G! f% e/ F
; K3 B2 F- Q2 |2 j
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
( E* `# ~/ ?/ L3 S
' R- u' h- B' W0 z0 o" [stmt.Exec()
1 J1 [2 m  a8 N- k+ S, x; ?7 U- H6 J, d+ v7 b
stmt.Close(). \' ]6 F5 R- T0 C
& c" c# T) d7 @. o& L
}! Z. M; l7 C3 k1 e! m
6 Y: z" l+ B% V. ~9 k% S
二、数据查询 - SELECT# i- s/ L* @! N  e* A7 p7 O3 s
5 M4 J% ^7 I8 V# |. c: }/ E
2.1 : DLang 查询数据
* f; w7 |- g+ J% \0 S
( P# U/ d- B3 V4 }import std.stdio;7 L- u5 O1 C: l- r- U

+ @+ f2 Z6 i8 v! U& d- |import hunt.database;2 S) p- `9 ?+ F- Y8 y' C9 N
9 q% f  U* z+ Z9 E% p
void main()5 G; ~5 b6 T& t8 w5 g) ]
/ [& w& X5 V& m2 h* W
{+ A$ E' J' s: H! r2 w1 |  k
4 c8 u' {2 P$ e5 o9 v
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");& K' R8 ]6 ^$ r; {8 Q

/ G6 R- w/ g% o! Oforeach(row; db.query("SELECT * FROM user LIMIT 10"))6 b; R& `+ K# `7 R- H: ^) |  T  t

3 p. Z8 g, s2 ^) U1 \6 R* h1 f6 n# m{; Z) w& `1 I2 p& K  ~, ?- Q

/ d2 y  R8 e4 ^" \! H9 B/ Twriteln(row["username"]);6 R$ E: a+ n/ W* A; e5 B

" V2 a; m/ ]; F$ d# m}
( r3 Z' O. ~  A6 B4 P: b( n# B! L7 ?7 u9 f
db.close();
6 a7 L, }; |2 X  R
6 k9 S! H' {& K. ]% z$ q6 \}& P- i6 }* D; f, ?) C- g
4 \$ w& }2 p8 F2 C6 D0 i$ J
2.2 : Rust 查询数据
' p$ n) k1 B' s5 J) F) {( S6 ~$ k* x, ^
extern crate postgres;
* T* w# H! x8 n8 @* F
( b4 ?2 f8 n. Buse postgres::{Connection, SslMode};0 W& x4 c6 o% a  {. ^6 X2 K

1 x$ R. [% i* r$ c$ Bfn main() {! Q% _6 u& b( u

' r0 N- f% d) s2 P; O6 Z% Nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();9 _0 R2 O2 B) t1 i3 Q9 d

% N& X4 q+ L, Bfor row in &conn.query("SELECT * FROM user", &[]).unwrap();1 N3 b# Q( d9 c2 t7 {
% ]$ z' p/ n( ]' Z
println!("Found person {}", row.get(0));
- X5 Z  Y* g9 I
3 A+ _) u3 L6 A}1 }- d* ]7 ~# G/ j! i! R
4 L1 h* m! K+ ]! G' d1 v
}# g3 r0 {; O: a6 a$ o

5 E+ L& N/ v2 j4 A1 |" Q, }4 `2.3 : Golang 查询数据( Q7 R6 A, @# q+ R! \" t( u+ ?  |8 K; `

0 a) [* g. p% _- @) Nimport (: g" [0 r' }7 j2 U9 N9 I
2 u& c+ N; }8 e( J, T( F$ l# G" p* G
"database/sql"4 |6 t1 _( [5 d" |0 I' i6 x& E1 K
0 P' q  T# R& @% u* f
"fmt"
# W9 {; R. m0 }1 z7 q6 d; y# u* y7 D+ Q0 r$ q
_ "github.com/lib/pq"2 N; S2 j- z' q$ W) E
# ?5 }# O2 O  _0 V( n
"time"5 G7 d6 H; l. B8 f  L8 O
7 X0 ]( S- n$ i3 U! Y
"log"' A! t" t' m; P6 {  s1 v3 [$ J
5 n# @4 V9 s3 l! R1 f, d" y+ j
)
3 Z0 z" f( P: S- `
+ g, T, K  O4 i6 }% B  }type User struct {7 `6 w9 w$ g% N* o- e0 N

: K! h5 w# `- Y3 |" v3 ~UserName string* n1 Z, K+ B6 W* U
; M) U$ D$ @2 g& ~1 Z" Y
}7 J9 |; H% Z3 g: C/ K
) X( @2 z  Z' w: g0 p
func main() {
2 k5 Q( _/ h/ _) k& a+ @2 q8 ], J/ [$ f
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( n1 D; n& I% D) T

( T% X  Y  ]$ _6 R+ s  j  X* U: wif err != nil {$ k' u! Q9 x8 N; C" U; v/ [
. J7 |8 k' S8 u: i1 b
log.Fatal(err)
  T% h, x' J( ?+ h2 o0 C/ b3 G8 ^. |6 B9 b& E* W, X
return nil2 z$ X. @+ A# T2 h( P- R& Y

" \7 |" q: {# s, a8 \2 W, L" {}6 n& [6 L3 G9 |: p3 N5 V$ L
9 n* N/ S4 U- F- f4 ]" ^
user := User{}
1 }& b9 E0 w% ]! w4 \6 R: f9 K& X- m7 g( C5 ^; A4 b+ @8 \. x
stmt := db.Query("SELECT * FROM user")5 ^1 j2 Y/ r& K. G4 w8 h
, K- _+ T- s$ G. r! }) h
for rows.Next() {; D% @! ^6 q; h8 v; @' x
% Z5 j4 o) p0 f3 `$ c9 i
rows.Scan(&user.UserName)/ R) V9 x  q0 A

% q3 K2 z; G9 Y/ Sfmt.Println(user.UserName)
* |. b2 {) {$ S2 D
1 g2 _+ e1 R( p& g- A0 _* }. M}) L$ n9 M0 d# I) S( V7 i6 u
3 K- P0 X. u& D6 x; G+ N
stmt.Close()
7 U0 W) O/ b6 B  U
, Q2 F- C8 M0 }& d8 U! m}
. L: t* J0 O; v" @; I& y! y
3 d: x5 [7 j; f; H, O三、总结6 p- d" x( \: ~6 s

$ H# ^3 g, _* ?2 A& c0 \5 Q对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
. ^3 f: \  D$ r- D0 V. R
! A) x) [' e8 L. X3 b# w2 y6 j% t0 I这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)( i3 A7 p8 {5 k9 J

- d" K, n2 X9 w3 _在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
, z) @4 v1 j, P; z; c% v5 s) r$ N2 G! U2 Q- }3 p* R9 Z
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
9 M% I+ M" D! a8 O8 C/ D) K————————————————
4 P7 R$ Z& X. ^; H* p" r版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' ~+ K  G. ~* z* s( J+ r原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 B1 F2 h( y9 K5 b2 q" g- y+ G+ @, }# C) Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 10:17 , Processed in 0.152503 second(s), 19 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!