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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

0 j% ?' ^2 Z* ~一、数据插入 - INSERT; T: j' D- ?/ Q6 A

8 w0 t; B& D; z7 I# l1.1 : DLang 插入数据
) S# E  ]3 K+ ?
- q% D6 _8 C  J: Q4 Aimport std.stdio;
- X& i3 f% L) q: d$ _* J( }! Q% [. c) N! {* l
import hunt.database;
5 e3 X( u2 B" o# \5 ?, Z5 `3 q& n% D, B; d, [( j# S2 Q1 i; Z
void main()* Y/ H. k/ @, h! E' g8 Y# s

2 g# F, {! b6 P; @: K{2 L5 V  v7 f) P2 }: ]0 {

. ~, M" y) }+ Pauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
' u1 G2 D* a/ |( Q+ x& s9 B, k$ U
1 u$ p0 h! Y. @0 @- Q9 p+ Oint result = db.execute(`INSERT INTO user(username) VALUES("test")`);% w0 j3 \2 H4 ?0 [

" l5 J. {# D: x4 O% N( A// 打印插入数量
" X3 Q& L. }. D0 {2 ?1 j4 K0 l, F: r# [1 e
writeln(result);
3 H; ]  u  H0 Y# u, j( E+ ~1 _5 T6 N  B1 N) {
db.close();% A. e8 h4 F, k

' K8 b/ c: W4 m0 W}
- q& s/ Z3 D7 F& P1 Q1 h4 Q/ b: n# C7 P7 X  ^# w
1.2 : Rust 插入数据
; a7 Z; x0 ~) M& F" y
- L' L% a+ b0 m! W! }; u; ~extern crate postgres;: }& C% j1 t- @, Q- p( }
0 L% V( M# s: N/ {" M
use postgres::{Connection, SslMode};
% w# A5 h$ Q: v/ V! b+ }% f
6 c+ {" H$ M* a' t) w9 V$ dfn main() {- @2 l$ X+ P- E- b  b* y* z" i

: B3 H! [5 Q, Nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
9 u: I9 B) `: N; }7 A* A- j) x  I3 A& V6 }5 i
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
& p9 U) ?1 m$ Z. u5 D* X- g
3 A: ^2 ?- Y' D/ ?$ ~}
( H- a2 e) \) y" d, C0 ?& _' k+ A8 y3 D$ j( ~+ y1 Y) [+ A1 D
1.3 : Golang 插入数据
7 y5 |* l% b+ s& x. d( i  {  X' j8 n/ W7 h$ r
import (
# C+ l% j+ F- q) w$ v/ U% w2 G: u2 U+ _2 V, k' G7 D
"database/sql"1 Y# X: z/ a2 K& r  `* k# g
  V# ]0 \/ _; _% ~  Q" b
"fmt"4 Z6 P% k& `1 R" O- f

; C' C8 l& z. w/ k0 B3 p2 {9 Q_ "github.com/lib/pq"
" f! V4 G, g* J1 x' M* u, ^8 x+ n
"time"
7 q: X- {6 T" k6 B
9 e7 |- t9 m/ X+ x"log"
. g" R  E( T0 G9 I# O5 h; q
% u7 U5 R$ `0 U! ~: R# w)
0 X. c& H2 @2 D0 E- b" R
* Q4 m! B# ^8 gfunc main() {! o0 ]% w4 @  L. O) i

4 B3 f2 E/ N3 g5 f& ^. O  tdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
6 j5 A  @  l& T5 p1 J* M# ]8 Y% }; ]( G! e  a  X4 l) G
if err != nil {( V( G6 a  w3 W6 g, N! e. i0 Q
9 I' ^8 A1 c* h9 N
log.Fatal(err)
  J. U* z# R- l7 |" C; s
: o$ |. P& `7 \, h  Ireturn nil
/ V' P% t" v+ w3 c$ _0 E. u( r" D) s1 k2 e4 v) g- D; x
}( |4 C0 _& G9 L' f3 X

# L0 }; M9 L3 x' O; r3 `stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
) {7 l  V- V5 g. W' H1 X) p" E& O+ z6 S/ ]. I8 k$ W9 S
stmt.Exec()4 `* B1 s9 v  J% O8 N

) U, u! ~. e0 W# ?stmt.Close()
# A7 M/ \5 ]( v: f+ M' @
. _8 [# t- ?& H( G}
$ M% s5 {* b$ s5 h: R
( M+ J" w( z* a# P$ {二、数据查询 - SELECT
$ |2 N& v4 b1 D9 i
; c# Z3 A; n/ O5 @) v2.1 : DLang 查询数据+ E, ?; S" G  f# G" {6 B9 l9 C& K

0 d2 P' r6 [/ D* O1 F. r! Simport std.stdio;) A  u& {2 y% f3 f4 r
% i6 r' V0 X, m  l. ]
import hunt.database;2 m( L6 m. S; N8 ~6 q4 a+ d. n

4 x. [6 M# H# q# C5 ]8 Avoid main()
$ T& }" [/ R' ^' r  u
( N: X- s) m- `/ x: a3 l) y{
, O, T) J3 J9 r; F$ G2 z( c8 d2 L$ g; \
- R& a9 }2 [' j' d9 Q. _, Pauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
4 c1 \0 e# b" ?+ }. Z$ B9 ^5 L/ `: r9 p2 `+ \
foreach(row; db.query("SELECT * FROM user LIMIT 10"))( E. ?5 J; ?- e+ ^
% o) ?- p( k8 o  `2 d: j2 g' H5 e& ~
{
8 K# R8 I+ B+ v) Y' h  d
4 w% O$ B3 s, h' y5 Uwriteln(row["username"]);7 }( j& j( s1 }6 V4 x5 C- @

, y% O8 C. Y5 K: [}
! T. W0 D, Z+ Q4 x. J9 O! p( _
: Z& s/ F" x2 A' D6 qdb.close();" f& F, }# N) L7 x. x
; c  u8 m, s0 `9 z
}
& s* R8 f; X4 m! r2 O
; o# ^; Q. Y: l; E7 f2.2 : Rust 查询数据
# E  q1 `  q  |& ?
7 n1 c1 `/ R! gextern crate postgres;2 t- t1 i! G  }, b8 x. |

5 @2 R+ T+ Y4 w  s6 d& x1 U( y. Ause postgres::{Connection, SslMode};
' T4 N2 I/ v& [  {7 _
  b8 E, A% E/ h, @7 m2 C- \# S, Hfn main() {
' p" x1 g3 A' y
6 j- }( E( s9 u: l6 K' Olet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ D- O% }+ q+ a% [/ z! a9 u1 Z4 `
4 X1 j, }3 e5 w( ?) H; B2 z1 l5 N
for row in &conn.query("SELECT * FROM user", &[]).unwrap();' V) f% Z; k% E) |6 i5 h  n' |9 J/ G
3 |; R, ?1 {  m; J
println!("Found person {}", row.get(0));
; I3 ]& r  K# B3 I3 s: a
& Q# s7 y- G* s! J2 t) ^}6 x) y$ P6 N) Z6 _) v6 g
- g' }* l) m1 K' g
}
- z! M! I) R9 U. G) V" y& u+ z$ V9 p$ G% o
2.3 : Golang 查询数据
" S3 A' U# O) m, ~* p1 D2 b( [/ [) u1 }( E- ]) b6 \
import (
8 S4 u# |6 c6 l* h8 f8 ~6 _4 L5 m7 u+ m: {0 G
"database/sql"
& d; y, \, N* H3 v. F. ~
$ @3 N2 n* w* ~% h# {# g1 ["fmt"
0 E' V. c( \; g- V" K& l% e+ Y# r# A' y) P0 D) ]# ?) _2 K: {
_ "github.com/lib/pq"
, Z% A) Y% ^3 x; s' G
% X/ V/ d+ Y: w, A' k: m2 c"time"% F2 _+ u, ^& M! t

$ e* e$ p0 Y3 _4 d5 g8 D6 ]0 a"log"
3 u8 L% V. X. u; r0 t7 W' a6 Y6 y' B$ T7 F# }' ^% t' J. x
)
3 D; a, u; a' S3 T9 v( q. ^0 F$ v; u. M
type User struct {
/ W% P4 r( _, h: l* L5 g& ]9 Q5 S& b& G4 X/ r
UserName string
2 i0 g5 w; b0 m( J  q5 G
$ P, ]( t% v8 e7 j- b( q2 a}
: S# Y4 ^* ^0 C9 d( A; E3 ^8 `8 p( K5 g2 Y' K. {
func main() {' t6 r! Y$ H% a1 \. Q

5 {/ p, H- Q' Y+ l  a! u: g) Bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")* j/ W6 B1 m; A" }* P6 t: }
9 ]; d/ O: z  A. k$ \4 _1 [  W
if err != nil {$ J# ~/ F8 P: b+ y# t6 ]* a

' s. `; w3 j+ z$ Q/ ?+ F0 N5 dlog.Fatal(err)3 `: f+ F* }$ e+ W  {: u

, n, v3 S7 B3 Q3 Y6 F, [return nil: s  d- @6 q2 h: ?
/ s- p, J/ Z3 O1 _* O
}
+ m6 k1 |6 m" Q9 {! V4 \2 N9 g/ R' N& \5 E* w) r
user := User{}) l" Y0 L7 j& k$ n) B
; G1 I% ~3 N' e/ n0 e! e
stmt := db.Query("SELECT * FROM user")
( A- w. a- ^% e# u
. b- Q4 z) E# m& r, p, afor rows.Next() {
: U* M0 U4 q, x! ~2 v& ?0 D, h
5 C5 r& _" h$ T/ Y6 Frows.Scan(&user.UserName): S4 F7 o1 s/ D, W4 w
- X3 Q, W0 C: d* m$ K& W/ K5 J. U
fmt.Println(user.UserName)
; q3 t1 t* O+ l" J' B% ?5 V- C; G6 q
}
! Y" |: Y$ j* ]" h( G% m$ o8 j
4 P* c2 B) O% }4 M2 mstmt.Close()
1 L% k6 P( P4 G) k* C1 `3 m+ d6 s- q9 r
}
4 P/ w% M0 z: n- b/ A' L; C5 B* a% J% d4 E: O0 I2 o
三、总结
/ K, P$ e+ O5 v) b, h5 T8 K! t7 u' i$ [& u
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
' Z, @( V5 ~+ R, J; p
7 u# b, n' t5 l. }% e7 A9 s这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)( q7 K* L' _% Y" T. a9 x

' v0 _* ?  n: O: ?/ K8 b( a在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
- y4 N% {# G' P( g8 \
) n+ o4 o" }' @! W# A1 `总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
+ ~# |* V7 M# h————————————————$ e5 J9 v" @6 y2 p4 n, u7 P
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  E0 L0 {1 `( K
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 x. u. y# \6 l5 b6 M* i9 C: }# J# [, G3 X4 P" d9 h  u* R" e0 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 23:52 , Processed in 0.052374 second(s), 19 queries .

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