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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。3 e" X, F% q- A" ~' x8 N  N7 [4 o
  w9 L  w5 L3 G2 s; H
一、数据插入 - INSERT
. n$ A" w4 q/ R6 c1 f( [6 a" k  X; g2 e8 D6 w8 T, }
1.1 : DLang 插入数据
4 I' L( g- C/ a+ ^* P/ r
0 X* e1 Q2 }" G2 u+ ?import std.stdio;
4 I) t" l. ]" U& x: v. F  S/ q% w; Q$ G* m: F) j7 Z& W+ b
import hunt.database;; R) h: E' s) K1 h4 E2 Q
6 T" l% }# l) K( W8 a7 D
void main()
4 [& p6 v. U# [1 i% U3 X4 p  q
% i' N, u5 s* T7 k  C, f{! \- D3 {+ A  u
0 d6 `; X, B* x# T1 H
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
: W9 U' Y3 l* j. X+ M1 t
) H& p  Q* s  I& uint result = db.execute(`INSERT INTO user(username) VALUES("test")`);: ?4 k+ e% n- K2 _+ ^
. L( H9 [4 f+ V  d2 @% z8 c0 W0 j
// 打印插入数量
. e1 g  ^3 ]; d& u5 p; o1 |! ?& \. S$ O+ A2 V1 B9 Q
writeln(result);
' W3 T. J4 I# a0 I0 v
# i* f! o" ?! r* Kdb.close();
! _! `- ~7 n) I' |- ~0 v
) R) F2 [+ r( o; i  x) A}$ B: s. Q: V, z: W7 G

. e1 g: \* g: q) Y1.2 : Rust 插入数据* b& _  Q! l$ n0 [# t  t
/ }  q3 z! U3 g+ g6 E( J% b7 u
extern crate postgres;
8 [1 y' W* t5 d3 O  b5 [2 F- s3 ?. J! Z1 t, m$ E3 s/ w# x" @7 b/ l
use postgres::{Connection, SslMode};
$ X/ w: C. t0 W' }; J! w3 A+ N( }+ q  g8 V  |
fn main() {
" ^. }  W% G6 i. X  J: N- s" r' K% n" g2 x. G
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();4 x, _" l4 v$ \! n+ \2 G' O

6 i$ @0 [% H& t/ }& S$ Oconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();# L: Y) O5 \) E, `- t7 R3 l) W
. A- P2 Y2 s2 }+ e5 O
}* o, s7 C  ]3 U5 K- T

* z  `- k0 Z6 R( C' S1.3 : Golang 插入数据7 g+ b3 O& X0 k
, |1 \* K# u( w7 x
import (0 [5 |3 O; |+ s  u+ G* J8 X

+ G( k" l8 j" f+ b"database/sql"0 b/ r* V, ?# P( S
* a- A8 R' E1 b3 _/ g4 x6 W
"fmt"
, i+ Z! X7 N( L" |
& R) x& a; y0 k+ k5 i" j# Q_ "github.com/lib/pq"% ^3 w, K9 d* E+ D4 Q" O, I/ q
$ b+ C8 r6 P: T+ i1 H) |! f
"time"
7 f. i# e) ^) d/ W2 n9 `; d: {( J1 \6 R
"log"
7 |3 t3 g( ]7 @
- Y" B" t, v# l)$ R: c, r6 |; n% ^  v
2 ]- A* b$ H" G
func main() {
$ A/ n. D% o# n0 Q
# \3 z: U6 c1 Zdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")& v% \% \% f: e8 G) `4 u3 @
+ G0 [8 X' ?) E8 _, N
if err != nil {
/ A0 b. s" P. ~0 A$ k# L- s$ _9 q; m' r" M
log.Fatal(err), K) [( |5 N# X! [' E& h
9 j3 @5 A3 l4 B( j
return nil
7 }4 O$ Q+ o3 n) x, W+ w6 Z, P/ Y0 X7 ]- f
}
9 i* R* S8 B1 J5 H) I5 Y
9 `1 v! o0 X, x! T! Zstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")2 W! J6 r1 ^" P: c1 T4 T4 r
& ]0 z, s5 b( [7 s" `. A
stmt.Exec()
7 e0 U8 ^( Z: ^
! c' w/ p9 V3 h" r- x2 D8 Ystmt.Close()
" j. U, u! b$ r- c( c; V8 D# i, W' Y: C+ ]4 Z7 U- t# f% S
}
. J- ]. D% v0 {0 b0 Z
5 n, R# U+ l- i+ H1 A/ R二、数据查询 - SELECT
# n* V8 t4 X2 [; U' V  A  N6 S
6 t' S+ X9 L( ~  P6 n& @8 v2.1 : DLang 查询数据
" I2 S0 ^+ h3 P5 }" E5 g4 {: N; n! Y" C: F% q
import std.stdio;
5 C( V7 a2 _4 U$ ^2 C) [& {1 z: @
import hunt.database;8 _6 ~7 ~7 N2 t: I2 X" n, ^
2 d, \: r% ]. z, i" k5 j6 I  F
void main()
4 z" ?+ i5 A" u. y: y4 S9 ?2 F3 C- ~! _0 c6 R
{- `2 v* n- b# _

# C4 g+ k5 F0 s$ O; dauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");# X, V* c) w# e* W# b8 i

1 d: {, E" s; A- h$ yforeach(row; db.query("SELECT * FROM user LIMIT 10"))8 L3 x# J# G8 [
" a* z( i! f9 @+ C7 Z* I% Q
{
& s- a1 E+ F2 x5 g, Q& l9 B; _. z3 \" r3 @1 Z
writeln(row["username"]);
, j+ G7 ]/ ?8 s2 t1 @
( ]" \3 h, C! p1 g8 c% Z3 z}# |, R+ z+ T7 K- [( X
0 S, B& @( v# G/ b+ E
db.close();5 h8 u" p9 n. U; d
; |5 u. ~; l" I+ x6 i
}9 [- M4 m) M- r4 k* N

+ `. t- V/ F8 c# O2.2 : Rust 查询数据7 O: R8 ~% C' ]; [* D. _! S

* a" G- C- k  |3 Textern crate postgres;
, J5 @* G# ?8 f
( [+ L6 [+ J& K: }' b7 y) ^use postgres::{Connection, SslMode};
; w4 S% o/ o6 t: b& Q8 I  @
- x+ @  v7 U/ F  |; x8 Tfn main() {& q, h' H. w, L' G% v2 U& e
: `1 a1 W8 C* h7 I
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
: t+ o7 ~! Y8 V8 u
) a6 |( \6 w; z* V1 K$ Z+ Dfor row in &conn.query("SELECT * FROM user", &[]).unwrap();: Y# }! r5 W0 T* A$ B, N5 g. H
% h/ O: y) P* Y9 M
println!("Found person {}", row.get(0));
/ h8 B: z. j) |8 e$ I# ^* ~* P) t# v' _2 A+ c
}8 y" w6 y9 J9 t3 a

. g0 e; @6 w+ b' p& H6 @$ q2 ^}
" m* A$ d% W9 Y% W, G& J) T0 @4 I, ?8 P: ]9 f; i
2.3 : Golang 查询数据/ `& M( Y5 A" ?' O# f8 c$ W' U
' b0 v5 O$ T6 v  w: |: G
import (' s: [" I# S4 u
' h" y4 \1 a7 T, c$ P; }
"database/sql"/ E! o  l6 i# Q) `/ C
* y% v% T" i( P: G( H! [
"fmt"4 p" c! s  P9 M# x/ U  u" _2 R4 X
1 t7 P8 V9 L, b( m2 u8 m& w0 v
_ "github.com/lib/pq"
8 H- G" O( M* H' y, g% u4 d/ P+ p
# x* I# }/ @+ q# l& n" E- h"time"
( {0 p. m4 c' k
7 w2 U4 p5 V1 ^) h; c, N3 P"log"
' O. T% T5 |2 y0 C) T5 G+ s) W
+ I4 r/ t0 {  |$ q/ U( [)8 h; F" A: X# p3 `' r

! G/ Z3 s; d1 C9 x' E; i( ptype User struct {$ ^) Q2 M( W- X- Q, P

4 N9 F/ n- R8 l. Q+ c7 PUserName string
/ E- x# ~& ?/ V' B. A$ o' F" H7 m1 ^' ]+ t6 I* A1 k# T* v
}. u' s, R6 S( i2 R- g+ W  K
3 Z5 q& W7 m5 U9 Z6 I
func main() {, _* d. M2 i0 S+ W7 s7 i7 y# h
; C7 r1 E  ~2 P9 }2 v, T2 ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! E+ @: L; y$ u$ O2 z5 \0 R, f* o! }" A- A
if err != nil {
" d$ v% X% R! @
4 z# L, T' u5 E! s0 @  Ulog.Fatal(err)
; m+ q2 y6 j$ F
( A5 u2 b0 k4 [( k: ~0 h; A& _return nil
% G5 q0 T8 K6 k/ Q2 T0 a' j: I. w/ q8 h1 B6 C* P2 p' z3 [
}
5 _2 ~- b5 b% Z# E& s( K" n1 l+ N3 k3 i7 d( o
user := User{}, _/ s- S" U  E" L; H& `

  U4 |" @4 V. Qstmt := db.Query("SELECT * FROM user")
- ^2 e1 t; |. R5 ?( S2 f' o& {: b6 g6 [* a" n4 H
for rows.Next() {6 d0 w" I0 l! e4 N
2 Y4 u. S# T2 o9 ?. i' O! P
rows.Scan(&user.UserName): T, x" q; l0 I% Q1 i' t

; C' |# O! T5 O+ K" G8 _fmt.Println(user.UserName)
# }" h& m/ m' T3 t- v1 q3 {# ]- Y/ J" K
}% v8 @/ I. ]( }# k4 }  s8 g* e/ p; [  K
% b8 J; u! [/ l5 S' ?
stmt.Close()
1 g) r* H  P3 \& F8 f1 S- e& m" h# w2 @8 X
}
/ w  Q( h: L: t8 |) \& M3 ?+ E4 w* X6 \8 c8 X# Y1 Z
三、总结1 y0 e1 q7 [# e8 ~- n/ h) j
0 B4 H0 J; D- N* q- ]! R/ l
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
$ T+ {) k3 J. v" P: t$ I- e
3 K( a) U# }; N9 D) B) d8 }这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
1 R4 x/ M' l( l) s2 b# U6 E; M9 l  B1 q3 A6 i0 }3 `+ U( p
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
7 u" }2 _1 j( t- @0 L. {3 z+ A/ n# D; a. V4 b; g
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。0 M  B) C1 @- {3 U; G
————————————————
9 s# m" ^( q, z版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& P& o% O: A, {3 `! K7 O
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961, X4 F/ E( z: c, g
7 |, D, O% \: a' o3 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:29 , Processed in 0.080835 second(s), 20 queries .

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