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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

) ?% \9 g5 v8 e! T" q一、数据插入 - INSERT+ e0 L8 z6 I3 n$ N0 N( ?

2 S$ E( o; L+ m8 G6 D1 |1.1 : DLang 插入数据0 G  ^4 |- z2 T7 R. N3 i' u

& a0 X; |, S! s. o8 \import std.stdio;( K" K+ g2 R: h0 f; |- s# N' ^

) h* h- V( e# H8 y% jimport hunt.database;3 A5 r# ?' f6 E# d1 c, ^+ U5 @

  X4 j& l/ }6 N5 \; B: q& V1 R. N  n- rvoid main()
2 S) m/ w% m* y; n6 i. Z! \- D. s5 }! a6 l5 p9 B; J
{1 I0 |$ ?5 G0 k, r

- f$ J& p5 c7 t- I/ L* L) fauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
, W, x' c# S7 Y3 P* J: u: z
0 O8 b$ s  l5 k7 C; o0 ~) Cint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
0 v$ f2 n$ C+ r
8 ]$ M: J1 x8 L! y/ U// 打印插入数量
* [& [+ Q0 k& g) g* [9 @& J5 U5 g4 j$ T' `" @. L! y/ D' y6 F: z! s
writeln(result);
, {/ O" N% g) M- J, E. g9 N! n
- k3 L  z# [+ ^  ?9 w! P& m5 H  _9 c% xdb.close();+ N2 x2 {$ i7 J- c: k: U3 E

% l" |9 H* L: U! s; @# E}
+ V+ i% l/ {& ]9 b! j
4 d- x! c) c6 l7 n" H1.2 : Rust 插入数据
/ d2 C$ G" `# ?" f0 }1 D+ D: M3 @" ?) M6 i- g+ F& m: K
extern crate postgres;+ h. z- C8 U# b
  ]0 {1 [& V" {1 i: s0 x9 h
use postgres::{Connection, SslMode};
# J3 s0 s3 [! U8 a0 `, P
2 i& c5 X' ]# g1 i, [% E' l" Wfn main() {, I. U8 M" ~, K: b- r% B
5 D+ l0 ]9 o9 w* W6 E
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();. y) b3 S* I% `) n% C# y
1 v1 B. z9 i$ x4 p
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
( H- R* s0 Z- N% q' r- e: c' t/ V" Y  }' Q0 M
}. b5 W) z3 W$ U

4 P- v8 U8 v, Z: S" }3 ~1.3 : Golang 插入数据4 Q" _, L7 B- _% D+ @! d  x: N
1 ?9 Y3 S& p/ V
import (7 w( _" s/ c- E3 C4 M) y
. R1 x6 e8 M) i3 d  \' N+ Z
"database/sql"
8 ^4 C5 t/ w: n8 U4 P6 q5 d+ E: K  ~  z
"fmt"; x$ L8 |) R1 P% F
& k8 f. K9 Y8 F4 g: u3 d& o6 ]
_ "github.com/lib/pq"
" n0 Z9 u9 _, O* X! u. u
) R! v! V  z4 O7 Y: s; _+ z"time"
& k# B" ^; D0 A, ?5 `6 f( w  L
8 g3 `$ }2 g5 L3 k+ ~"log"/ \! B3 X3 f& t4 H% U( ?3 m

" c% ]+ a+ b$ ~! Q5 l)) f: H4 q* Q, d: N( V
, f+ c9 D- H) J7 b& M" M
func main() {; Z+ A: c% W. T# l4 |, \

  b1 M/ b, J4 Z1 v; Tdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' y7 v6 y# M/ ~# H4 e
& L1 W1 p0 e! p' E: Jif err != nil {
1 d! ^* d  b/ a1 R6 U+ V# v1 f' y& t# s5 l) r7 @) w1 z( u
log.Fatal(err)
$ Y* v1 T, n( ?3 |  S7 {  ?1 F$ \. h# u0 n, Y4 f
return nil
) K% \& h5 g8 Q: h: ?# {3 V* n+ r6 c" [" W7 l
}
* a' m+ q4 q) d( s8 E7 m5 |" k
% k+ g9 V) l$ Tstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")7 z4 F$ ~' S! V( M* f$ F
1 a2 f3 ~% J6 Y/ b6 g
stmt.Exec()
! s; F1 [+ l# S4 o8 v# l0 k4 J# }$ g5 l# A4 P: H1 i: _% i
stmt.Close()3 V2 c+ ]3 h4 K3 j) t+ i2 k- k7 z* H& a

4 B4 d  Q. j+ I9 R8 t, y}" Z: u# y' M6 n& @

) R! ^& T  k$ v; D: F4 x1 V0 R二、数据查询 - SELECT, p9 b7 H# M  H2 r& b. ?  `

$ {5 t8 I" ^% K$ b1 d2 R; A2.1 : DLang 查询数据
; h: U3 v% C' L3 h* }" i' O5 t1 I0 u0 p; e7 A+ S; y+ M5 L) I
import std.stdio;
9 u7 W/ D1 J& _$ b: Y
0 Q2 A) h5 R* d( wimport hunt.database;6 t4 q* f% b# \3 U6 O
) z, M3 `9 q7 t: M3 }! d
void main()  P: J& p+ W4 G0 o  K) ^

: I: x1 O7 U. V( t2 g" ^{1 x3 z0 s# K$ E& j1 l( V) e" }! F1 H1 F

3 s+ G% g  m! O) d  a5 |auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- t" ]- s! E9 w7 i

, I9 h( i) B9 x  t8 {$ L1 U' zforeach(row; db.query("SELECT * FROM user LIMIT 10"))5 v- D5 \; @- i4 {1 {+ g, X

1 X; U  b! e6 P) g5 ?$ I* {% Z{8 ~' t  E$ N  W6 c/ m9 r& G0 P

& e7 y8 k- S+ E; f  ?8 X& Y3 k$ Bwriteln(row["username"]);$ M* l' K0 |& `3 J- f- X
+ j# M7 |0 c: ~2 N+ h% N
}
' e7 ^0 b- O# f& E" x) ?& T* q! |2 \: V9 |; C6 m
db.close();8 n& C# Z# X9 H, V, @% h$ Y6 e3 K

. T  k0 T% N8 @" [$ E# g}
0 q# j0 e; v3 v7 Z2 N. T+ b8 l' ]. F9 B  R7 h3 ~
2.2 : Rust 查询数据4 X) |! j7 q' k8 S" k

1 g: l8 s* O! N0 j* j$ ~: Zextern crate postgres;
2 v) P/ a9 _& S$ `  U
/ e& R" k% _3 j2 X) |use postgres::{Connection, SslMode};" \* S  Y- q( G- p0 b) r4 h8 c

: [0 ~# q8 y7 m* N: Tfn main() {% z' k8 z8 ]  g% m/ S9 ~5 h
; m9 B- C. ]1 k
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 B" n0 _9 M0 A; F0 J1 S" `8 E
& L3 m; e4 k/ C# g
for row in &conn.query("SELECT * FROM user", &[]).unwrap();: N% _& _$ y8 q: T% ~0 G4 O* u1 J9 _
' S9 ~7 O9 c; g+ C) R; |+ W
println!("Found person {}", row.get(0));
# p! t! ?0 K4 p
8 v- `, {: W6 x9 i% U" N  `) H}
& [$ o  w, f+ N7 L4 d7 @+ f7 x! Q& x9 c2 D
}
, y. |0 {1 R' y0 L4 M& U3 F+ |& \# i+ J5 R2 O
2.3 : Golang 查询数据. G" D5 e$ f# B6 ]9 \% f$ O0 p

6 M0 }& U. P9 B' ~, `( himport (2 U9 A0 X! m$ b  T+ T7 [# n8 c

) K8 v/ V/ A. G. p8 E, N/ p"database/sql"' c1 E3 {6 \  q! y* M9 q
) }* v; I# Q5 G5 q
"fmt"
/ n. |9 ^, t( ?
/ o0 k) M8 U# ^* }; i4 p' S_ "github.com/lib/pq"
$ @* P2 |7 r' ^7 ~. U6 f
8 R' H2 i- l0 x& [( {"time"4 t5 \! u5 @# s/ A3 k7 `# p3 }

  M6 L& \+ p6 H1 \* A' T1 |"log"; f5 x" a& Z* {  f, ^8 t7 v
, }! z6 _  |& f+ O4 J
)
5 o' I; w$ T! q' e- V. K% I7 p) |7 K7 [) i6 `
type User struct {
7 ~# f5 G# S- K/ h+ k
# [% J3 \2 K3 Z# V* fUserName string+ \# g% `4 M4 B4 y7 |8 b
3 B% T2 ^5 e' q9 `+ @% u: u
}5 y3 O2 E4 C) {  ?6 O5 o, I

; d" ~1 @# q, w8 |9 z! G# e% cfunc main() {+ k, M, F3 e$ C9 s) c
) n5 h+ L3 ~  e
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
$ r- a3 _; u" r  \( i; E; \$ V
2 s$ {5 S. J- S# D/ Pif err != nil {# w& {6 S/ F2 d
+ s. ?0 e- K; }* s7 Y
log.Fatal(err)0 s6 l" N: l/ k$ R8 W4 o

+ B/ {* [! Y1 b( z5 ?2 Ureturn nil
+ S7 m: A3 w) S( t; X. N7 k' P% _5 u0 J4 w: ]
}
3 \! n' `' q' z  m* W( i  O' F" L
user := User{}" [6 d. Q, e/ L0 z' B8 x

  J0 `3 Y5 {2 f$ a! sstmt := db.Query("SELECT * FROM user")* C2 H* B. r) z, x; y

. g; d' A* @! W+ Kfor rows.Next() {
' o, u3 Y- D! O9 G- l  \- k' ~/ O3 x+ E: B
rows.Scan(&user.UserName)
9 _' r2 I( v) C7 g1 F. m+ W9 u2 m, M
fmt.Println(user.UserName)
" p( b! j# r  g
& F! H5 v$ _$ |! l}
% q% l7 k# [, y
4 s3 L1 K' V7 w7 _7 N3 _% mstmt.Close()  i0 @3 i- `8 Z6 K: l6 f$ @6 [

. f& S( e$ k9 j- t: |}0 u: T! @$ o) D8 G

0 e9 m; ^# d2 [5 |6 [三、总结3 j! X$ c% K1 a# ]7 d

1 `* R0 ^( X& d" ]1 w, F对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
+ j3 m' z/ M" ~2 J3 _: `  v9 r# m
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
3 {, M+ k+ t* J1 M6 L3 d
6 {. P# n2 Y" U在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。9 r. e( r  w3 r8 u& V5 s7 S, F# I
7 [$ H, w, I4 Q% [6 C
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
7 {- h/ @- X* y0 R& Z9 c————————————————4 ^' |+ z+ {; Q* r0 b
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 u4 \, M' k1 X8 ^" T) v+ S
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961$ j0 A$ {8 O2 n" x

8 K+ r+ c; K) }- c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 09:57 , Processed in 0.051598 second(s), 19 queries .

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