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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

0 l. q0 R$ B2 w一、数据插入 - INSERT( a! y. M# i% w3 g

& E# k/ K" V7 f" J6 h1.1 : DLang 插入数据
8 b3 a& B* c& P9 y( ?  n
) S3 ~* P( D- \0 o0 G) d% timport std.stdio;
) J4 T" O/ p6 m, p8 H, s; U, O5 \$ s+ p; ~* ?
import hunt.database;
: I7 d0 m9 ?4 L9 n- F$ ]1 o7 l
( x& t# c- M4 I: i. x: y* G( Dvoid main()/ u2 G" \* N. M2 o4 |. V
) ~; Y; s; a" l  X& N
{
0 t$ N; T5 d: V
  X# L. ~& D$ Z4 u" Oauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
" v2 s* T) p# j) U2 `/ o
, a* _7 x# |% A( W# y7 xint result = db.execute(`INSERT INTO user(username) VALUES("test")`);; Z( g1 K1 Q8 B" B7 w
9 m4 |$ A7 _" s0 w# b7 ?
// 打印插入数量4 \# `: |4 `7 E4 b- R7 f! X
! S! J% A6 |" q' N' v2 K
writeln(result);
2 m4 G+ Y0 T+ d5 t- q, y7 S' F; H0 s. R/ J0 X- f
db.close();% R: d8 s! E3 N% d; Z0 m. T

6 ^( H* S- x$ p7 f" z: }  t}. U3 D8 v+ @- J, G9 z) g

6 d3 G5 y7 e  C! ]; d' W! B2 \4 e1.2 : Rust 插入数据
! P+ w" P5 J1 b; N9 ~
9 E- b' e( n4 ^. V, w1 B2 m2 E! `8 Lextern crate postgres;
/ F3 p' Q- H" `. C/ `" d7 K; e# T+ U) ^. q
use postgres::{Connection, SslMode};. f8 a+ ~! S- A; N! K6 {( u$ n

2 v% D' s% Y' f0 q) Wfn main() {3 ~# t5 \, b( ^  s+ I8 U8 ~$ v
3 v( [" H& x6 _( B- `- L
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
$ M. }3 S! ~) O, L' ?4 T; B; u, J# O4 Q! @. s3 [
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();9 j3 z# ?$ t6 q- T: J
1 n' `$ |- {% y/ X
}% {3 g" W8 Q9 D- C
8 R' w- T* F2 _9 w2 A
1.3 : Golang 插入数据, \. F* b9 K: P
/ }; y8 j5 `( a5 Q, |4 h
import (
' `9 j; j. l( i5 {# L! c6 W7 o/ E0 T3 ^+ Z, A0 W
"database/sql"
0 r5 D' o# w8 C' F4 H. P0 v1 D" N( T6 l2 a# U. r" c' t
"fmt"
& W6 x; }  c& v* o* V
  r  \+ `7 M' I3 Z" Q_ "github.com/lib/pq"2 n  l8 I/ _2 Q6 ?
( f: g: I3 z" e
"time"7 r+ r* `: {8 d

* f, J1 N$ B! C2 n  X- y' u"log"3 I7 |1 [4 T. M
5 _/ {6 g4 ]5 X
)
  T. u5 ^9 F/ p0 g, l
( \& ^9 d( M% G9 k$ I+ xfunc main() {  y. H4 t  L3 W( N4 r% o

" q) R1 w5 p( j! qdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
3 P, O& O. F3 B! q6 v1 N. H+ H
- y8 c. y: Y; K8 {/ mif err != nil {
4 V8 e6 O- r+ h; _/ Z
3 t$ m7 I1 L  }) Rlog.Fatal(err)% r* a9 k7 e5 t1 {) [) D

: U9 z' N- R. E" Freturn nil; r/ E9 E8 |/ m' y8 D- F

7 S0 [$ }  W8 M$ z% }5 p  v}
/ D9 @. {% g+ j4 H, q; E% e, ~% g; B* z4 V2 m  z# x" S) U
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
7 d5 ?. g0 }( `$ E0 d9 D6 }
4 Z4 c. p1 l& F" ?. p, Zstmt.Exec()
) ~' x% u, M" X! v. N" r5 H6 Z
/ W/ H# ~( n+ R5 E+ q4 X) |stmt.Close()
3 R8 e# g; P7 J2 v- {/ Z1 R3 f9 C* }" L
}  b& g3 ]  T4 q1 }$ H7 l/ b9 a

7 I; m& c( F6 g7 R1 w, Z二、数据查询 - SELECT* I' H6 D6 m) ?6 {8 k- [* e
3 m0 _0 {! E( A2 o3 w
2.1 : DLang 查询数据
4 }, ~% z% V8 n8 i6 ]) j, a5 r
! E/ r4 E/ T( Simport std.stdio;
* [3 _; T$ ~) K" _
) r. J. V" i9 h5 o# z8 \import hunt.database;  K  d( g5 G( P9 \
3 X% S/ \$ k2 U2 x/ c% g
void main()! r: v* A* s$ A
6 a+ Z; `. A5 ^- w+ d+ {
{
! T; ^1 o) Q& ^
$ p7 J% l" G" k: uauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");: X$ H: u/ e3 Y1 `+ K! Q: g
0 S2 f2 r* R9 \5 m6 e4 t
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
  s/ ^' i. z( G; b' J8 n: m( w) c0 F  U' O
{
+ a7 w$ J, T- q6 ?/ W4 m, r+ P. W3 K3 j! O* `
writeln(row["username"]);9 w# v5 H: Z1 g. D
4 I! e5 K, n) D& e
}
  F  ]) g7 ~0 m/ J; N. N& W3 V, _, ^0 y
db.close();; x( ]8 N7 b! B
* k* b7 K0 ^- Y, e
}( P7 _( c% M' l7 I

" ^, g% k. o2 w3 |0 B4 a2.2 : Rust 查询数据
9 a/ H$ F2 X: e9 h% r  J- J  v
; j! l5 l" a" Q9 ]7 i" nextern crate postgres;# B! \, ?- s, x+ g: s( w. O* A
6 `- x9 w3 W) p
use postgres::{Connection, SslMode};
- U1 x  v5 ~( T. n( G& Q3 Y
: R! [! a  M5 b7 Q5 Hfn main() {8 [& O; w; n5 p

4 N9 F& Y! H, x$ wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
. I, c" p' h3 o2 v. f. L" G+ d* r! j- s5 J
for row in &conn.query("SELECT * FROM user", &[]).unwrap();# I' l3 ?+ g, W" B# k0 W/ c

  r" N( Y8 n' z  `: ^! fprintln!("Found person {}", row.get(0));
, r3 i8 v, D2 I6 T4 ]; X' Y
' i  s3 R7 Q4 G2 _) U, J2 n}
- M& V7 \5 }% @; v' I! u. h* Q; N3 ?2 q  M7 s
}! H4 T9 u( P3 z; @! J
; Y. x: Z  j: k3 g
2.3 : Golang 查询数据
% p. ~0 F( `# {7 r. D' f/ @
% h- i% @+ A/ f+ p2 Vimport (- E: v7 K+ z: d- b
/ H- @% ]8 Y+ x8 e! m. b9 o& p
"database/sql"
* e% h4 w! b' o, _, l% N) l6 S+ z( ]( A3 d2 s
"fmt"
; N' t# R# w+ ]" V$ n+ C8 \  O' Q- }& n! F& b" W' `# T
_ "github.com/lib/pq"
+ s* J0 q, `. i8 x/ t% \& O6 ]
# z& X) Q2 A3 R3 e& D/ o& C"time"
# G$ x  s; g! E% N4 A3 }$ z9 S! O) s9 ^
"log"5 p. F* n3 e. K2 }

' k8 k3 X  a% M)
# c, q" h# p) l3 ?% a7 w# s( v1 K4 c6 j
type User struct {
9 j; ^* K, x9 G1 ^' _
& H& [' O; Z' t5 _UserName string
# [# i1 K% c: N& v/ ~9 j' \; v- V) n4 {
}
! L8 N) k. K, w, J/ r& A% z# Y, W( W' H  G1 C
func main() {
4 v9 P7 H& T# {4 B* z
" J/ D$ ?7 u2 z0 N* O7 d4 `- J8 Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 ]. u/ P; Q5 u. l1 s/ E) B" Z5 B) X
$ [) m; W- @# j9 Y1 _
if err != nil {
" x" j$ v6 m& _7 \7 O4 {: V/ `8 X- ^+ k$ h! G& Q+ \# A: }
log.Fatal(err)' M- a3 h1 Q0 ~3 Y/ b% Y1 T/ k* t

: K2 r. t$ \, S* R# u& Nreturn nil
* I% x7 F" ~5 `
' I" {1 R. n7 T1 Z2 l- L1 m+ y}
& W" W& ~; r1 U2 n: B1 i% k3 z6 _6 h9 }2 ~$ A8 ~  e
user := User{}/ p; Y% N# {+ i# F# _; T
. T& }! f2 V/ C$ h6 Z
stmt := db.Query("SELECT * FROM user")0 D8 O' n' V" O2 z. O1 V

+ j0 [# b' G$ w5 C8 V/ U/ a( n  Sfor rows.Next() {
* U, V7 h0 }* \0 n8 _! d) S$ I9 Y+ Y1 a# U: l) x( C
rows.Scan(&user.UserName)1 h6 l& L$ X4 c% P! N1 D0 }
, ]' a4 l7 U0 P* u3 w+ h
fmt.Println(user.UserName)
0 G' H! I5 `6 N- Q# s9 P$ B1 Y, T7 ?. u
}
' s- w! @9 T1 F* z+ V* V; e7 N2 E; m
6 K, j+ r2 g) @6 F6 T. X9 e* Bstmt.Close()
: E- |7 w! {! n0 [1 q% ^, _) b. D2 U# a6 S  x
}) n' K+ X* J( R6 n+ S
$ f9 j% a+ c6 M) G: x9 _
三、总结
4 N# H( Z9 D+ X: o* }" H
4 i+ t. B* X6 H对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。9 n! O  D3 R8 L/ s

. _* N# S( Q# s这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)1 p5 m* C% L" A; O: E7 B* d

" w% i1 g$ c- k! f. Q在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
4 \& c+ `1 a9 e4 F4 d) ]3 s) m/ a- m# F2 e. E8 e
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。+ L  k1 f. ~+ j0 n5 F
————————————————) H6 ]; y; N1 e' R# O' T+ _/ p$ y* a
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 s9 r2 C7 j! d3 _原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
; |2 F$ Q! {8 n$ O# |$ M6 U) A7 e( i: z+ p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 22:08 , Processed in 0.123222 second(s), 19 queries .

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