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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
, t0 {/ L0 H6 a# Z. I  q4 Q- o: ?" z! A) k$ v/ b
一、数据插入 - INSERT$ z- G8 [' v: M4 B; C5 O) C9 j
% w8 a. t7 b5 t* c3 R. S/ {
1.1 : DLang 插入数据
# ~3 T6 t' g3 S2 E# ^5 @3 L* N0 b+ J
- r+ Q5 F9 r8 Himport std.stdio;  ~$ o! r0 A& h  m8 R
, N9 u7 J7 l# }7 L4 v+ N6 A
import hunt.database;2 g" \. g& \9 y: n

: h& r6 O5 U3 V0 G5 j+ Wvoid main(), Y8 g; h7 J- }/ r9 [
0 S; B6 Q! r( k$ V
{5 ~, e0 J; u5 }% ^$ N
; L+ z+ R8 x$ A( s5 ?( k
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ D2 l- ~! p5 g$ j1 q5 M; R3 ]* |0 h' I# L, |$ n1 W% c0 ]- m$ P
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
' \8 C# j) W- b& |
1 P' Y' k! a; Z1 T// 打印插入数量
& \. S5 H' L) b/ |' S: s" U- z. C& ^0 @% n% N* i
writeln(result);
6 g, I) L; d* G' `
$ }4 ^$ ]; x5 M( b" P0 l9 x7 ]" Hdb.close();
3 x" c' e2 m6 _7 x5 z  d, Y5 m# R4 w) {$ j: \" r
}
( o4 H* ?1 [/ a8 q1 }; q$ o
% q: V8 y% N( O( O9 L& o+ w1.2 : Rust 插入数据- H1 K4 R- u& T& e

0 E3 s  S" P6 @2 ~! nextern crate postgres;+ b6 a3 J$ v- P5 X7 |$ ]" V

0 i! a2 [7 ]$ q! puse postgres::{Connection, SslMode};
* D& L! @$ R% i
+ C% D% \* j& w7 y% w! i( `fn main() {. W! q+ }& x1 P& T) G7 y
, V6 V+ V4 T4 X4 ]0 m6 ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 _& z: B4 f2 i) m: e6 x7 t" j2 h: l- g  y9 |" z: g: E! C
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();3 s; }  k4 `& u( I

0 A6 W7 k3 ~# p9 l}
5 M7 g1 `0 O; D1 n- q4 r9 N' @
% ~. H" r* N* V3 }1.3 : Golang 插入数据
" l$ W8 C8 J( S( w2 o
) {5 I$ r& J' f- Zimport (9 ^& Y# ^+ r  R" l

, p5 h' ?7 Q9 Q4 O"database/sql"8 N5 u# r  Z7 G
, g5 ?4 v5 _* x# U% v
"fmt"
: l: W% E. p% i. p4 }' r9 T1 G* U% q: m, @/ B. ^
_ "github.com/lib/pq"  N8 t2 g0 b& J' Q6 H
- Y' A4 m* J. n) W/ I. j& i
"time"0 Q1 y. E3 t  y$ D8 q/ ~

3 O/ E" ?! f; z* F"log"+ J0 G4 m' T/ h

. P$ t0 U! Z% C3 [$ Y+ ^# O)
. K; n* V' u, B9 ]4 ^) s9 {9 a7 L. L
func main() {3 j( O1 r! |" _" p3 }( i' B

/ D8 }3 R/ n) pdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")2 h( G: u4 W, P! s; @7 H, q, d

' V( n- w1 }/ N9 s8 q+ Oif err != nil {+ R7 V: X, G1 F1 [  a

* G  H3 D" s9 ~" z- S0 V) `log.Fatal(err)
( F5 O# w# L% D
0 ~. Y" ]  v! A+ E/ U- Areturn nil) F6 \8 d6 _* D7 l

9 G5 u  h7 D6 m4 E}
( d' N: O0 ?( @9 g$ @  Q$ `
; ?& o  h/ E9 I3 S0 Xstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")4 ]! j* v0 C! w. p7 {2 F

# Z+ N8 t# k/ L# _+ A. a: |. \stmt.Exec()
9 \8 y- `  g9 R$ x6 V" K+ E. }- T' u! T5 N7 ^3 |
stmt.Close()" v9 S& J: w8 C
& W' n8 o. w, N# x2 E' d+ n
}
1 B0 v3 b7 M3 E# V8 n
7 `5 z. I, K$ o. F" H% r  P二、数据查询 - SELECT! g: ~2 d; d) O( \, T# u

# Z2 `6 i$ ]& n$ n8 L9 v0 M2.1 : DLang 查询数据
* p! ]- L) t0 |  }% K
0 h8 L$ ]( }& J* j  x+ m/ zimport std.stdio;
6 g3 r* `/ `3 x+ N6 _' q; ]" X
; z) ~# d+ X6 v8 K$ eimport hunt.database;4 P- V3 G; P1 S
2 ]7 K) W' N* }" s1 y# F
void main()
; s% i% M4 q# F$ p
( k6 R: i2 L6 B; W{& S) k* p# ^7 u& `# w; L

, ~+ Q5 b- U5 Y* @: kauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");' j/ z* B6 Q% O6 D- Y

. Q: h. |* X6 P6 D  vforeach(row; db.query("SELECT * FROM user LIMIT 10"))
* Q0 h4 v3 f! j8 }8 G2 M
: I- \/ `: {: c" Q! p& g1 }! a3 y{
9 Z& a" w: M9 t" ]  [  ]) g
( R; d! V  F5 Q- [" ]writeln(row["username"]);
1 H" b  y$ I+ V3 F# n/ ]  E
1 V9 i( T* y9 |) u; q}. Y1 `' y3 Q. V; Z
1 M, `- a- {0 f  |% O
db.close();2 b, T0 u; m3 P  A

$ N8 z; W' w+ {3 ]6 C}7 @! X8 h* ^3 S2 e
2 X& b3 v% S  a2 F
2.2 : Rust 查询数据* ?( E6 D: A- h3 \6 a' J; e
) @/ y) I5 H9 Q+ t
extern crate postgres;2 N; n. L; Y& s; I1 G8 o
5 j# t- d7 Y- `9 ~
use postgres::{Connection, SslMode};
" ?. z# a9 p$ Y* o- D) M& h5 J  P- \+ U3 [
fn main() {# i+ w& h5 l5 e3 u& p$ Y2 ~! _
  m( {8 u+ c" B4 W
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();; e* y/ f, K* S$ v$ _* {
- t$ M) b6 r+ u5 x4 W
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
3 `, y, N3 y1 C9 ~1 j
. t/ C# x  a- @1 Y0 [3 q5 ?println!("Found person {}", row.get(0));
5 g; `. D& S; X0 p+ T9 T  J# P* H# t$ i
}4 _5 _% n$ u: D' ~9 L; E/ i  j8 l

- Y6 E* G* e' n! s}3 ]5 B8 A- F* z4 W# U8 W
2 {( ~' r; ~! Q, O0 N' m
2.3 : Golang 查询数据* h% C: s& [0 z3 \# m; n

2 q0 K1 {; N: }0 p4 v" Zimport (
; B. F# Q- u4 b# h0 c0 }+ s' F1 G" p. W( R; j. L# B
"database/sql"/ e) Q+ f& C- l: s
; l& A& s# p& y; c+ A
"fmt"3 Y8 p4 d/ d5 a" j) ?* I) y/ r4 K- s
" g, B1 I: L  g0 Y; l# f
_ "github.com/lib/pq"
2 s4 w9 e  L" q2 e
6 J: @5 t  m' Z5 ?2 A% E' M1 h"time"
% ~* _- A+ E3 x& G+ B" R% f
. x/ I1 c: M- p" y* M) B"log"! w) B% M0 n4 S& O# R& d1 O

  _3 r& T+ n9 ~& U)
" e( w) i* s0 D) t1 J
7 e/ B7 L/ [& t% n$ q/ B: W# W; vtype User struct {
% N6 x# B' W8 d8 Q8 _/ }! X5 }  E- D7 Y8 ]. P& {/ Y
UserName string
0 S& b+ ~5 k; S' z2 S5 m1 k2 e) ~- n
}$ k0 Z2 @; _0 w6 D0 A1 J# l& O5 ^5 Z
0 d/ g8 o: y. P  d
func main() {; b( h" `8 i) \4 b$ i

+ S; a8 d7 e+ N% ^$ o  m$ d: Rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 M; T% d$ e+ v

! |; E- M& B8 n% |: Xif err != nil {
5 n/ P" H  f8 y; a. y8 M4 i7 b  r9 ~* u! }) H& v
log.Fatal(err)
' Z7 r! s/ }% q. N  u6 K$ \6 S& z4 N2 n6 L: c* p
return nil  F- `# G; _+ `& L$ M/ q! _) n

  u5 q/ ]6 x- y9 P6 M# I/ U}
" U0 s& d! l6 B6 j" @+ O5 Z$ C1 X1 U1 Y# g
user := User{}
- F) ~3 a, k" B- x2 p- u' r: e4 k# l
stmt := db.Query("SELECT * FROM user")  ?: t0 L# F0 o. j8 H9 I
$ @: d) u) q2 Q6 \
for rows.Next() {
. W# z+ u3 ~9 n, {5 Z
# Y0 @& o2 r- z5 Lrows.Scan(&user.UserName)4 d) g$ P) V  i8 w

7 b4 Z) a- h& d2 X$ ?' bfmt.Println(user.UserName)
/ I6 L/ M+ u9 {* E! s* G
( |6 Y) a- B' J) G( }0 y}
8 H' N; K: H0 v5 u  j
; q- n( e0 i9 _- S6 |# V, `stmt.Close()6 L1 R4 a! s/ n: S8 X

0 q& B& ^0 v9 N4 }8 G8 o}
9 e, X& x* G& b: N( v% Z9 K8 G) T" R* z( m0 k& i
三、总结0 R& M6 d3 B* g2 q9 ~! f8 }7 a

5 v; H, O6 q6 {( v1 H8 ^对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
/ ^' Y# ~- r' M! T' ~
3 j8 x( s% I4 @( C! o- y9 a这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)0 k( s. x+ y# [# K) U  q
6 T, ~* y; Z; W
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。/ j7 G) A/ [8 ^  c/ K. K& Q

! C: a! \) S4 t1 t  R8 U" P总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
% N0 o) ]2 W4 p/ E# M% Z% n; Q————————————————# ]2 w0 _' E1 ?
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ c1 ]! _5 b% m+ F5 X
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
# U% c3 u, v9 y+ v; n3 M( x+ N# o
  K3 G: }% H% p# x, b4 F( X" \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:16 , Processed in 0.055517 second(s), 20 queries .

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