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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
5 w; ]# S4 f. V0 ]/ J6 [5 l7 e( |4 A9 T
一、数据插入 - INSERT
& a% x! ], w$ A+ L6 h
% q9 B+ V% Z" X* Z7 w1.1 : DLang 插入数据7 j* {! D# U6 E+ P

& g( k& `" R, D1 Pimport std.stdio;
# B* }2 o1 k# k, x0 m* u/ Z( L) g) z  a$ B
import hunt.database;
. P' O3 o4 K5 _% P* W6 M: t4 x, j" u) \6 }6 f0 Y
void main()& x# `0 m- J3 K- b1 W+ }

: m. z4 y6 g; U{
: M3 X$ q; u* F- z  w6 b' t
! i+ `! b; b- B" o! B9 Lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- A  `9 ~8 ?' b+ f5 f5 P7 W9 N& h
+ y* ]& _, f: j6 i/ s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);, A* O/ b4 D! Z1 m# i" [; Q+ F6 i

* d' t3 f: S: j: w/ p// 打印插入数量: g. r( @, i" o/ D& a5 J

4 q+ {3 }& j- `5 Kwriteln(result);
: X/ e6 Z" V5 w9 q
/ x: }6 |5 ?6 W$ s! w- n" jdb.close();
0 t" h! A7 m4 u$ o' p- g' i# B
5 z+ g3 @6 ?- A}+ x, P! W, q3 z

0 G1 [2 }* g" a7 ^" m: B9 `1.2 : Rust 插入数据3 d- ^* `0 t4 L( f( M1 j& b8 ]

8 {5 U' L6 D, fextern crate postgres;% F0 k! Q9 a5 q& C
) i! |" F; {8 F% v- o
use postgres::{Connection, SslMode};' O5 F9 |' p# g* I# u2 \

- {" t! S% w, C7 B4 P5 H8 Z, v+ Ufn main() {
# y4 Q6 [  \9 f/ v
( p" y! _; R  R  k1 Flet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
9 v0 M8 N6 K2 a4 `! C. v6 b+ U2 H; s; u: s) e$ S- S- X
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();- H  `& q! A4 _" v+ u3 a" @
# r  P, y2 W3 J0 P7 ~9 M' x
}. E% `6 T' |0 p  N0 p( H9 D3 E' k
& \: P0 `" D6 v, m3 D# q, K: R
1.3 : Golang 插入数据$ q" C0 c9 w1 \% u  z
# s- E# y2 G( R9 P: X9 g8 e7 O
import (, _8 y. x/ m2 `) h2 Q4 G

- v5 p. N, m9 B7 Q+ a2 z1 G% n$ Y# D"database/sql"
( R/ T, X. {, v5 i: e4 |9 _+ D3 m" T; j& Y+ H7 a: {5 ]
"fmt"6 [. c! e3 E) \0 @8 Z' d* E) M  S
# ]" h: h& h) `: `7 c- d! J) x8 d0 m
_ "github.com/lib/pq"7 c2 {5 z" A& f; O

4 R4 m; ]/ ~/ C' a) `& u: ]"time"8 w" c# P2 }. v3 T" q! P/ G

! [$ c7 C% o: n4 E( q"log"& {  g2 E- V7 ?

2 Z/ f( i% D( h8 N7 D); L' O& Y8 _$ h' X& v6 s

9 U' h* ~  J* e) I1 ofunc main() {; W/ R; W! }4 x9 x, u( O8 K

+ B7 R+ F5 H' v1 {- {% z$ z* F- Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
) i! l+ |1 X8 g" H; ~, r0 S; h6 ~6 H& k! `* \+ J/ z# s
if err != nil {
; Z) h8 a( |! w* ^9 r0 k3 Y# k9 P
log.Fatal(err)
' ?  o. H- E2 [6 u% e
2 {+ K# H3 d* j  i- n. Yreturn nil% c* w4 p& j4 G" N" f
  s' F* Z4 I+ }' b' W
}
; o$ {& }  ?6 z( q" p! c, B7 S8 w) q
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
$ s- E# \2 R+ I. c0 k) M/ ]0 P: x% P
stmt.Exec()
$ L7 E4 O5 Y6 N2 B9 |
/ q( V! Z2 o4 U+ Rstmt.Close()- U. q, W. r" E6 `% L# q
0 f. n0 I& A) m+ h% T. f
}  I+ `, D3 ?% z' g4 m& I7 s+ i
: z" G+ Z/ @" c$ C- e
二、数据查询 - SELECT- E6 f+ [2 x. v4 J3 n9 t; L

+ M3 ~% p; k: E6 m8 G2 {+ D* K2.1 : DLang 查询数据. H1 g. F+ c. E6 j( A+ |* K
. U6 s5 h" }/ R0 e: A! Q; q" ~
import std.stdio;
5 \+ @+ B& y3 ]! T9 F9 B5 q% W' J. c" A% V  o7 B
import hunt.database;
9 y$ V1 m5 S; M. i
: d1 f$ n5 ?. ^& ]void main()
4 G( S; [, Y/ L. I2 _& s
. F% X( ]7 {& ]( x; |{
6 o5 o4 m$ w% |9 v. C6 Q/ _/ V# Z+ {3 J; ]5 h
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
' a+ m1 |3 ~3 y" p, L0 P) S4 p
) v8 ~' R, x) o- f7 b9 Z5 c8 gforeach(row; db.query("SELECT * FROM user LIMIT 10"))" |/ Q5 L! F1 b5 ~, ?
4 R( _& \! j1 W4 I5 t, ]
{
: S- U' G2 @+ P8 C* i# w% P: n* z0 _( Z/ O# h( R7 O% L+ N
writeln(row["username"]);
+ }6 o4 n5 X6 j/ `
; D6 s8 ?$ E, S5 D( Q- L! M}
. ?* B- G8 h, v$ M8 u( o2 l) n# I) f& h- U
db.close();
& ]2 D% F6 }' `$ w6 |* n/ R
- r- E* d  B7 l8 M3 \}
8 o& P# n$ U' j
- I! U' ^( V2 o2.2 : Rust 查询数据3 r2 ~1 R$ u! x! ^5 U) S. z2 b6 C

; c* T1 t- H5 z. v" j4 D; Vextern crate postgres;5 o' C7 Q) g' S: _0 o& F) O2 [

/ \+ y) o) \  `3 J9 [7 Fuse postgres::{Connection, SslMode};
. b" U# `4 K7 |1 G
& A, p" T& {% A" l, x$ B! Vfn main() {
* F2 D- b( \9 ?/ _% {/ C9 a- g9 t
/ S: z5 s# t+ o) o0 n1 V/ Wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();) G" j3 Z* f8 g( A

* P& Q, y$ N+ n* A7 J2 S0 Wfor row in &conn.query("SELECT * FROM user", &[]).unwrap();. N3 V+ e( O: `( H- y0 L& ^

2 K5 {' s( M: ?& r0 H4 gprintln!("Found person {}", row.get(0));- k8 w6 C7 z2 u! {8 b4 a9 h

; K2 a7 D! {  Q* {. v: w}8 j, L" j" z9 J" C( ], }
) d6 p6 W3 J1 Y3 Y1 r
}( j1 h' f+ p: y) y+ b; a7 `
4 l# `, C* v8 v4 L
2.3 : Golang 查询数据
/ _4 o  {6 j/ z
+ v+ ?) F8 m. n7 [9 d6 Eimport ($ J& j0 ]7 @, j1 I. y

; _/ H6 S2 }0 S  n"database/sql"
* u. C1 v: Q! f7 F) X: u" V' l
. _6 T& `, m: ~3 I$ J( y"fmt"
& v( B/ v& h- n
* z. Y1 _- M, y( v% V/ v/ o_ "github.com/lib/pq"  ]6 X, m3 D4 Z; V4 H2 J8 H
; K0 g4 b6 \+ [
"time") F5 c. V" f7 ~7 _

+ T  c7 I1 R; i. v) T1 U& g5 j"log"
5 O% y6 v3 X/ B* K# \$ \; ~5 S* S/ [0 O
), h4 O- K1 A) W) X& O

6 M$ R7 X1 U2 Ftype User struct {
; C% b" M" B* ]. [3 X* R5 t8 |6 \* K4 e( ^+ F9 }8 g: X: i& E$ q% `
UserName string) \- m5 }# b: Q

3 Y2 o# s1 ?' ^- o8 j}" d: Q0 p! j9 q8 \

; |. Z. E9 T: Afunc main() {
$ ]& K) j9 b% Z* p6 |! F4 H, c6 }' \( w0 P
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
( G$ \) _2 E5 L2 @" I# c6 ~1 O8 K* e2 k3 y. z
if err != nil {9 N6 S1 S& i% {
) n( Q) @8 d6 s" e, ~2 }, c
log.Fatal(err)* x" ~0 c  n3 P" p/ B5 w. R) H6 I

: X) N7 U2 s% r! R3 L' creturn nil
& _3 Q( D$ e' V5 C8 L5 O- n# h- w7 T7 e
}9 d2 h% v" }0 `, {+ E, a% C
+ o5 u4 V7 O5 b6 x' H! M$ H1 J4 j9 Q
user := User{}( g: x. Y# ]+ c- n# s* P' K9 _( {

7 K8 b4 W* Y% |0 a* _stmt := db.Query("SELECT * FROM user"); p- U+ }, c" R

% C( R' e( J# }6 G0 Q8 l4 X5 B6 K# mfor rows.Next() {# {% L; g5 r3 j* o; O- H

8 R, n2 ^6 W0 s( g* v& ~; T; e% Zrows.Scan(&user.UserName)9 l$ J5 k. j4 X' Y, F8 E
1 c( K" }2 J( i3 q
fmt.Println(user.UserName)# Y4 s& ?7 {0 e2 |

0 ~2 O$ {  i* u: O, R}6 K* @- n$ ^8 e3 v  g; T% C5 ^! g
7 m! j1 D# y8 C/ i3 S1 N
stmt.Close()/ t2 m# U% r, r8 C3 X/ c

( c# M5 D+ |$ P, w}
1 ]) b% r8 Y" @' d, d" u( Y* V0 s
三、总结
* f7 F, `( D& Q9 S! b/ F# J# E; |( f5 X$ x; F7 N
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。* Q5 u* e& H# w" a/ |- c

% M3 v* C% W3 m7 ^$ c5 s( _; O这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
$ ?' @- l2 K+ y7 H2 ]2 F2 ~8 b
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。/ H6 s$ \- Z( N- l9 |7 R

# I+ c5 u+ M  c8 }总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。6 Q: x, t' ^. I, Z
————————————————
+ n, p2 R8 q) T* X( F5 i+ V版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" A, z: }1 ]: A/ F# E( S
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
" }3 x# I/ k. \5 F! T
$ ^) k3 \: V$ c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 18:31 , Processed in 0.148786 second(s), 19 queries .

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