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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
4 {* v7 B, F& k5 U' L3 k# c, a- T
" C, `) e5 C! s( L  p3 h一、数据插入 - INSERT
, d; J. T9 O' K& h0 u  ^1 w
' h, l$ s5 `0 f) W, e$ X1.1 : DLang 插入数据
# P& v( }  Y7 i
4 M  F1 B6 L& u9 L/ M- Limport std.stdio;' |8 |( R4 D& D  I2 [6 f& U  c
4 ]) r$ r+ m5 O$ n9 d( L& `8 j
import hunt.database;
; {- i# \4 @2 I6 c- t; O
2 h  t# a% k% @5 n5 a' }; e1 Bvoid main()% F( @( `1 ]! [/ r) r2 Q0 Z/ V' J& l

3 y' a) b; t. l& r- W{1 U/ \/ W5 D4 L1 V( J
/ ?8 Q; k  Z, B
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; d% P& \- c- F8 e" U# @) N+ B6 X3 v) Q. y3 Y2 p5 J" M% l" C
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
  @; ?4 w  t" i: Q* Z: X$ _( e# R' |' ^9 U* s1 G4 M: `* `
// 打印插入数量
. ^1 l  @8 C2 Z1 [5 M1 q2 A
+ G& ], d# L! ywriteln(result);; \9 R& L4 V4 g5 t
# H  ^# G# T" Q' r  G
db.close();
& K  A5 l# U. D2 Y4 T
8 ~5 Z; ~+ C' n9 @# ~2 l* P}
( ~% P" N( U$ x- y2 W( ~* E& e+ f
1.2 : Rust 插入数据1 {: s& q5 e, o  v$ P

! b) C( }1 m/ d: q6 N. U9 s; Yextern crate postgres;- {/ ]6 l+ u" S- L- _
. N  R9 X# Z, L6 z3 E
use postgres::{Connection, SslMode};
# v" L( ]8 Y& R1 m
# a! K. x( k) R1 Dfn main() {* a& X# U6 M2 t, ]3 t

. G+ Y/ Z1 K8 _3 i  Xlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
  g8 I* e- f) U6 x/ A3 h
' d2 `& D. [, I9 c0 b8 l# q1 iconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();) v9 _# U. k2 y9 _- ~- p
* `/ e( K$ u9 }1 [2 Y% S* k
}
1 T- q5 o! w6 O3 W7 ?  m: r6 Z9 _3 @- D, n/ h
1.3 : Golang 插入数据
' D* I2 Y; e8 Q) D
9 Z! H1 P2 s- r8 cimport (3 i8 i8 ?/ _, [$ z4 e8 v# C' Z* h5 u! U

# i, C) ?- W& Z4 M"database/sql"
* a- U& ?! T4 [: u* ?( A& ]; A1 J' x) F$ `) i9 I
"fmt"
! e: w! S( Z4 \. D; L! I3 N) w4 Z5 y# c/ W
_ "github.com/lib/pq"
" ?/ g/ v# R% z2 y: G, Z; w, k$ X8 u  _3 y
"time"
: s- u: I* A: W. Z3 {7 m3 D' D7 h
+ n6 t! c) E4 {$ A2 p$ F3 t. E"log"5 d5 T- i8 Q2 t  p2 Z. x$ I
- n0 c8 D0 y3 E: m
)6 c- b% ~3 \( E0 C) k. `2 g, J, D/ F

( a- E! x! j3 |3 ?+ T3 M% p. yfunc main() {
! Z. B( z4 W' N7 t3 c  \/ ^) K5 k7 z! K. q# D) h8 o  }- g' Q9 |
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 V  r0 p: k/ p' l' f' a+ p" V
% G' }0 S1 V7 ^8 }- g! W9 ?
if err != nil {/ l# T0 W, r' x2 x- L
, q% B) h5 s* |/ Q1 p
log.Fatal(err)
7 w7 \+ j" V5 x; T, D6 ~5 Z5 A, ]: A8 R% q5 K
return nil% x4 t7 a6 l: {) a6 n1 C. _
" Z( A4 F! `3 J, q8 E, D
}- X& N5 B4 J- R9 u# n
1 b8 ?7 A6 V  _3 M: t/ B; e* {3 b
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")5 A. b3 Y; O7 U
7 Z+ ^9 O5 y8 o1 _1 q0 L1 l( {( P8 o
stmt.Exec()  \, `4 W4 X" s( a4 d* k* f
. B9 x, {3 N, N( H8 i2 I) w4 D* V
stmt.Close()$ I. E  {" T2 p; B

) R; }+ w1 ~2 B  |4 P}8 {' m. c& Y1 T/ e% K" q

. H" w4 C+ k2 ^二、数据查询 - SELECT2 P! G5 N+ [9 f
$ J. r+ V6 @0 F( w* {- ?
2.1 : DLang 查询数据$ s3 ^* d& X+ D4 r/ f4 o2 ^6 z* {
4 P6 }( d5 m8 y9 k
import std.stdio;' `" n. ?/ g/ C9 X- _& ]

1 r3 N0 V6 z+ o1 r* mimport hunt.database;
6 `+ E3 l. b: S8 c% _
* x7 F0 U: ~, y) N2 Uvoid main()5 i+ h2 O  N) q) \
! w: d1 }8 ?( y+ I% ?0 J. g$ l
{
: Y9 |1 X7 C% Z# I; V8 g
: F6 q. O' y3 z7 zauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; }. g; Y1 v: ]' A1 ?' y8 t
; W  l/ A9 ]7 Gforeach(row; db.query("SELECT * FROM user LIMIT 10"))' r* J' \& I, W/ g4 y% r

4 s1 t: x) c9 r- h{
9 ?& @- N$ l9 k# A. b' k4 `$ X. _9 @
writeln(row["username"]);: ?0 j/ e# U* ]1 R. G9 L
! \  W) |+ ?, E* `; I
}
3 z. t3 f4 y3 e! g$ }3 x9 j: Q3 d
db.close();( t  q/ t6 l6 l( L+ A+ |
6 @* Y, d+ P* w, u1 Q* s- j6 |
}
% o- v, l  x4 o, }4 K/ h; R6 K- ^6 Q2 a* X9 B. U$ @) ^6 Y
2.2 : Rust 查询数据
3 c0 C2 l# O, I8 ?
) J, ?# P  H+ ?. z/ S7 Oextern crate postgres;
% E/ R& k* R$ ^% d; I, ]. Q- a: T1 L2 c( s8 V+ A
use postgres::{Connection, SslMode};
9 F, |& {  m( Q8 D! q* |5 B$ v* A6 I1 ~% O# x. h6 x; S
fn main() {
. f0 e+ [* W5 L3 r# P+ j( U" T) w3 ?( K3 K; @9 i4 I
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();+ D% z# p1 e  w. i9 `+ j

% S. X+ J  V2 s/ h7 r4 _4 Ifor row in &conn.query("SELECT * FROM user", &[]).unwrap();, y  H2 G% g2 c# R7 o( o) }6 N: f% s( W
4 c+ @3 O$ ~9 o0 l" C
println!("Found person {}", row.get(0));
( s' X5 F9 [7 h6 O1 R1 X# `4 D/ h8 X  e+ p1 [" L( f
}: d$ ^. c% i, L- \$ V7 f$ }3 l% y

5 g( N! O& q# M, L5 q4 A}" d+ ]4 e2 z, y9 a5 K( z8 ?
/ Q# d3 |! B. }: Z0 m' I" T
2.3 : Golang 查询数据% Z% f' f. [7 l8 k, ?% j
: ]' R5 J& _6 C$ V9 N% R
import (- G7 i2 U! t4 |$ r& x
0 a# t% \6 @8 q; ^8 s
"database/sql"
; X) I: j9 }" R6 [. T. @
" H" E: g) j3 d3 Y- Y' H9 l- h) m"fmt"
6 K+ R: e/ v, @! K. x1 u  X! G" }
  B( w) J& I: b0 }: A0 p_ "github.com/lib/pq"
  {; U; f! y, K2 H, U4 M; R1 a! l; ?+ ]( F' A6 ]' a+ |: b
"time"
( Q5 \% |8 t: U. D$ u) M8 l% C) V3 u
"log"
  r& b0 }! h3 W& N- V8 V6 A8 }; S& M) e/ k* f
)  s5 t2 c+ I  J" z1 {

& A8 X: |( u6 D1 p% Otype User struct {
$ S) Q# r& [) p) s* ?; a3 C6 j$ |; N6 P/ r
UserName string# S  t& ?/ o( f& l  C/ C
. M( c4 m' F5 j2 z
}
4 j* a. K1 x' z- H& b( M
" I2 x/ }& V& o: u9 zfunc main() {$ w9 p6 M/ P8 X& {) \* L

) j) f6 R! u- h( w; l( Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 W$ L: X% |5 v7 g8 @6 T' y6 Z
3 ]9 x/ l: g9 E) m2 e5 r
if err != nil {
. T2 z7 i" i, S
( W1 X1 V! h' dlog.Fatal(err)2 e! O$ p4 q" q6 N4 R% |

5 E3 T/ V; H5 f9 b- E' Z2 Dreturn nil; M) K2 K4 ?! N: I. J  [2 S
, {! L4 A! }$ ^' F* Y: r6 S
}
5 }9 O# H- y$ L8 O+ o0 @9 }$ i
1 |! M5 m4 x# V: C1 r2 {user := User{}
) T. |8 R9 _0 @. f
6 m8 a9 M9 s+ A9 b; fstmt := db.Query("SELECT * FROM user")
% e" N7 E% X* T& g1 F) _& t, j! G2 @9 l; o# @2 S
for rows.Next() {
6 g6 g" n' P: k2 y* f
" [& E) d# {2 A* Orows.Scan(&user.UserName)
# o( z' {& t- C
3 Y5 ^6 T+ r$ A( Zfmt.Println(user.UserName)
. u2 ~" G. a' z/ {- _( J0 ~$ h4 I7 ?* q8 X
}
! {& Y5 M9 {2 _8 D, N+ W2 y. l( a# L9 D1 i' Z) \( ]" @3 \) A1 }
stmt.Close()  p  ?4 P! E' Z) F9 Q( I& z4 j7 a

5 {+ C4 Z% e6 A0 t}
, p5 v' |& Y0 Z. ~$ K# S& y# p( F* _6 n
三、总结
$ S4 s# j+ h+ U1 I
0 r! ^% `! Y" [; A: Z对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
: D( T$ w/ w9 U$ F$ j; y6 e
" V. L) T, T* o& b" ]2 n, `1 Q8 `这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好): |5 H3 ?4 J. ?9 X* l* G7 K

9 w+ ?+ ^4 I8 S在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
' M( i0 ^2 C* a4 a( J7 r
7 A% r0 j- `; c1 i  S3 h总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。$ h" B; {8 u2 y* ~+ B( _/ E2 Z
————————————————
' U" W, X' i# Q0 w4 ~3 R版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 G5 L% R) A. f
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961- h  Y* z  i1 \1 a2 T
- v& e% }% ^9 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:05 , Processed in 0.055004 second(s), 19 queries .

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