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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。) u$ ~, C: s# V8 O

  U9 h& f& B: p' {) y* p* |一、数据插入 - INSERT. B- J9 D  Q- d* l$ w+ h

* `1 C6 f  o+ T" L, W3 |4 z1.1 : DLang 插入数据
! k1 ], T: l% a- I8 }  g$ U
% }) z% b0 v( H/ B9 ~% Pimport std.stdio;% G1 v1 B0 I4 U6 V' G4 I4 P2 Z

6 H6 I  p. P8 |2 g) O+ }import hunt.database;
1 p- Q8 M# R' Q6 h
0 \9 ?( f: j( ]4 G; X. y+ Avoid main()
; ^5 e8 e6 g9 L! j& J
4 J6 |) z% H. y6 @+ E( s{, O# @  @8 z: s) f1 R

0 R/ L" l2 e+ p2 T2 k& E; x; Wauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");7 o1 M" f! ~1 F2 S" l8 r+ x0 `
9 g2 S6 w4 Y+ t( D
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
# H3 `9 u- P# x  h; @/ j( z+ U; z( G9 y: K* v3 O  i
// 打印插入数量
+ U2 B6 W5 Y5 L: w; `+ e$ ^3 B* ^
% [$ [: }9 B1 f2 D1 Jwriteln(result);5 d1 d- ?' w0 K0 Z# y8 l6 e

% n2 J/ M8 r, ^& C4 [& ydb.close();! Y# r- L0 i: @
' n) ]0 L- |/ u. u/ E
}! j3 ^* F& d+ O5 ~3 V
1 P: ^8 E, `) [: u4 X
1.2 : Rust 插入数据
5 Y7 E5 D# h* R+ j1 N. `2 j+ h/ Z" i
" ^9 C% J& L# J9 R5 v! P. ]extern crate postgres;
  n3 u0 }  D; o# n) h0 M: L6 C
; q. b; M. r8 P* S  T: Suse postgres::{Connection, SslMode};
5 B% ~; z) r. p2 U, S
* R7 i9 ^3 h+ Vfn main() {
& V* ]6 ]$ D9 n) T
4 y. H( I6 _: s6 c4 zlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();: g7 b- j6 ?, U2 s6 t' f

0 z5 y: A0 M6 d9 ^: e. a& tconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' K" [+ `- R1 O1 r9 ]6 ^" a* c' u' x0 Q: S9 M
}/ J0 R% h; g% s6 O: b& ~: o) m

4 ^! `: a5 L% ]2 H/ m, Q- u1.3 : Golang 插入数据- z& L9 O# c. e# ]) m

! u  x; k. w6 D8 g4 kimport (
. k( E6 x- H* e& e2 x+ L6 x5 T+ ]9 f
"database/sql"4 |- d- ^3 V. y
; L" a  o& a9 q5 d! T
"fmt"
! b( V4 n, h* F
$ K$ j& l" o% ]* m+ w_ "github.com/lib/pq"
% q" y* P* c6 ~) l5 d1 q4 z, t9 v$ S  K* y2 G
"time"
( Q$ {6 U: V2 @  W, `4 Q& V0 d8 g. p6 Q! x( G. |0 f% H9 p
"log"3 B9 m- n+ q% I1 h3 o) b' s% R
! A$ V1 \9 f7 |
)
, @; w$ C( m% }  v! v3 e6 T  F1 r) @" [' }
func main() {
: X7 M# P6 @! m
) k' Y. W, q* }; c) ]6 s$ c. Bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); ^6 \; t6 E4 ^1 |6 O, w
- L0 G9 m& }% q5 o9 x9 A; V- z
if err != nil {
" V, g. L2 e& q+ T! H$ B+ n+ Q$ o' w$ E4 r( _' h( F. e
log.Fatal(err)
9 B1 {, D7 L0 ]$ m; H# y% R
4 g8 H0 |8 W3 f+ mreturn nil
* h1 g0 `6 E! d* L) p# X* [$ w) o
8 S9 k( `& m) J}
3 `- W, Z* Y. E1 o$ F+ P' o$ B6 @/ n$ `/ _4 \/ [9 u7 ^  v
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")! E7 e2 r5 ~1 h- W- E' g

* I, K) I3 g( t. a1 gstmt.Exec()3 x5 f6 i$ V) i5 M
7 W% |6 j- A2 m9 h; N
stmt.Close()& n2 s2 ?4 K' m! s5 Z  `' ~

3 i8 K+ a) U7 Y}
" F/ q. `; X7 t
4 V1 q, R2 J8 r/ b) G二、数据查询 - SELECT: f9 P4 y2 K% F" j. d

" R. J6 H5 S- S1 O( [2.1 : DLang 查询数据- K* i! r/ ^) N7 y' J

# y+ Z' W  l' h* I8 }+ `. bimport std.stdio;$ O- ]+ P. N) a6 r* u
" `! r/ t7 D3 ]: I) H+ F* d
import hunt.database;
$ O+ ?4 J1 b& ~6 K  }' L+ I1 {; ~9 @1 d  p4 L
void main()  x3 E* O% j) E9 s6 _" O  ^

! Y- V( H2 T) R1 Y# k4 \{5 j3 \" r4 ^6 S  `' m

& ?% x) j/ |8 o+ i& dauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; g* g$ g+ Z; e
% {& j2 H6 [+ B( P
foreach(row; db.query("SELECT * FROM user LIMIT 10"))( R" z! B7 Y( M2 N$ R8 ]$ T

3 a7 C4 U( z# ~7 ]% o5 e{( H6 o0 m, I! _  q$ ~
, r1 S: }; N0 c% v  q& U
writeln(row["username"]);/ T0 T4 I9 M- l$ d5 }3 y' k' N% A& T
/ b3 q' v; Q/ z: a/ E% c2 y
}, ~( c0 r0 U8 l$ a/ V

# @: v0 s# D! @* t4 Bdb.close();5 Z3 u% j2 Y1 p' d5 C4 u
* F9 J$ n* _- K3 r
}
! F0 j5 |% g5 Y$ c! }5 u: f- d: T5 C* `0 T& H% ]
2.2 : Rust 查询数据) S6 I7 d( l, \) B! w; j+ f

/ P4 {# Q; v# N) `1 U  Vextern crate postgres;
' k/ z4 {: u: a) A8 E& u  e; f& I
use postgres::{Connection, SslMode};
; K! q% O( _! H" B4 }: y, c! R6 Y
, \, k" x5 A/ d* y$ Afn main() {, P, e. f+ D. |1 [4 T4 x( L4 L- m

7 \/ ~) m' W* q9 [& W/ W1 qlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
" i7 y( Z- S! N5 C. Z% `+ a
$ ^$ l! g: n; |" y( h" |3 t! Q- w6 pfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
  |7 j( T7 {0 v5 M* ^  i2 y/ J8 Y
println!("Found person {}", row.get(0));; o& L, C$ c& y
) U! u# u( t2 r# a- @
}. x) \$ G3 |4 F
4 B7 P4 ~! A/ t$ `7 ]. N
}
. ^9 J  q/ B; x7 a
% V+ ~$ o. I& f* Q/ w! T2 l3 s) K2.3 : Golang 查询数据3 o) a; J# _2 F+ [) @

. X6 W! ~( V* |2 s4 F8 {' Mimport (+ e, n! f! |" T6 U, D6 M
0 O) K: G3 h2 x0 D
"database/sql"# d$ k! B" P" i" S6 O0 P5 U
6 q" u. \, O- I% D' b7 G
"fmt"
! n/ A4 A3 z5 k. V+ \' u% b' t' e2 W  H/ _. L- z2 `$ b# N
_ "github.com/lib/pq"
2 S# S0 {4 h( l  B8 D; b8 ^  {6 j
. A) N! k1 B/ Y  j6 `"time"' s$ N) X+ h5 a% g+ U

2 e& t) D0 _- {"log". j& ]) J9 E  z, [1 r1 S

4 B. m2 U- E3 T5 N+ D+ N) g& Q/ k)" M3 ]) J. L# k4 C' t
+ x( K8 U" z! Z, T) K5 y+ ~
type User struct {
; o* L; n" \. l4 x
6 d+ }1 V- I* {# O+ O) T/ DUserName string: L* r' G. R8 P' V! f
" G9 D/ u: D4 O0 |: G$ O* ]1 V
}3 H% b4 t( F, E: l/ X0 x4 ]
7 O: b5 e' t9 V9 f) X5 E
func main() {" @9 y3 o. N  H+ U+ w/ A
+ |' ?5 Z1 @% [! k" J
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"): M7 T& c+ f5 T7 |

$ p8 G$ G* c$ [2 G' Zif err != nil {
% `# H7 P* I+ m6 v+ C
( e* }  M, a8 l+ ^# C! }log.Fatal(err)1 Q3 p& O' M& X' _9 W0 p# b" e2 _

- S( k, E0 G+ j4 vreturn nil7 O: Y! d$ i3 R1 w* u! }* z+ F8 y9 _

, n, Z* c" b5 L* y# K$ g! t}7 L+ o" G8 q5 a6 p9 n

% J* F2 y9 {6 Euser := User{}
' r: w6 `3 S- @0 ]+ P
4 I- E  Z6 z9 E( [0 L8 i& |* cstmt := db.Query("SELECT * FROM user"). O8 \# b# y: e
6 l5 t" o$ j6 w  f4 _+ K) W: b
for rows.Next() {2 |% R$ ?( t- V

/ `9 n% u4 a* C8 s6 z  Mrows.Scan(&user.UserName)
6 }; E, }2 l# g' G3 o! b9 H
  B/ [' i9 a8 Z. @' vfmt.Println(user.UserName)$ v2 @0 M  \( b( o6 i- s

5 a3 ~/ x5 }( _6 q% t) B+ O7 T5 `/ q}6 ?4 X  N1 P, O* K

% }/ W* Q  d1 u) sstmt.Close()
+ @8 ~$ }% U9 w& b- ]; ^% d+ t' t; u& J
}! F  X: \1 z% @* K
" T% @4 F6 Q# g8 |# Y9 J
三、总结
: e2 ]" p$ a. P) j& j  A/ B% \7 @) l5 o
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。" ~! U* X6 k7 G

. H9 h, g5 `) z) J: h这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
& o& h+ b: ?4 X- R
3 U1 g" U* C  r& {6 `/ g5 }1 G- L在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。" ]- o5 G, U9 ^# a4 y
2 f6 k+ W0 L# T# C  R
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。% L! K: n( y7 a2 _3 _1 t
————————————————
/ E8 [. ?9 _# x/ H. D1 l6 j; C版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ Q. G/ y2 R, T4 g+ x* C3 F
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339617 ^" |7 e8 z( Q
, B* C( s# H7 ~9 f/ ]$ O. k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:45 , Processed in 0.064507 second(s), 20 queries .

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