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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

5 D/ l7 w1 J5 @/ w一、数据插入 - INSERT! N* T5 N. b2 R1 U# o. z
* H7 {# G$ u5 F& M- x# W' E1 H
1.1 : DLang 插入数据
* E# t% f. X& b* d$ N5 \- D4 I. x/ h. N3 ^' Z
import std.stdio;
1 v% C6 y3 [. H( ]2 ]4 o
: e9 Q7 ^! \2 s6 e7 Himport hunt.database;! Z8 r$ F" U; n4 m+ R! K6 m7 L
4 _4 ]+ P+ T- M/ A* N3 N+ r
void main()
3 {3 ?0 P6 r# Z& v- @+ A
9 U6 t- w, J( O( J{/ s# ]' t( o; m: o9 H, M0 t
0 @/ K& i8 l1 c. f
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");+ D/ W! ]1 e% H6 x- S& q9 T& ?
* P* u9 _9 d* s/ X: J1 c$ _/ z  s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
& {. d8 Z( t) ^+ W2 C; I/ A( R! Z$ M7 S9 H% h) H
// 打印插入数量
7 J7 X; v; T, _0 f2 C7 V, \
+ F" }3 T' w' Q+ a: u0 ?writeln(result);* J8 a/ f5 `' |  y, A5 g

3 _" W1 u% ^: j0 b) s9 ?7 Adb.close();
7 a; r2 j0 }3 ~0 w* C) i, _$ C4 |( E0 r. h1 K8 T+ j
}
/ y9 m8 X& _3 k% J
0 N& a% t! R- Z* ~1.2 : Rust 插入数据" Z+ w4 z8 {/ V
+ ]/ a5 U6 j( O, T
extern crate postgres;
) H% k' f6 h% m" f
/ a- j1 j- q: Ouse postgres::{Connection, SslMode};
/ ?$ v* n2 I1 d2 f  T8 l: k# K. E! [3 _5 D# p6 O2 ]$ c* r! e
fn main() {1 u( F$ E7 W' I0 T; L$ i  \

; n+ A4 R" |2 C& F, xlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
7 E  M) |- B9 c5 c% i1 B0 u. x
7 O# o3 `. [, l! Mconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();* q: R+ ]- `/ X0 e/ U% a

6 o, |2 e. i; h5 C+ ^6 x}' R8 `0 p2 G& O$ v
& _4 y* ^1 Y9 o; ~
1.3 : Golang 插入数据
& n5 N( G7 L  A% {, p( g( t# [1 M
import (
% I1 c/ M( d' }$ g( E
) `# a- ]+ M6 J% n  b0 h  j6 T. ~7 D"database/sql"& X% z) _0 R2 ^( O1 Z  E
, j7 b: [% r% K9 ^/ w
"fmt"
: X  m9 J8 F/ K% O0 l( l: z; X" i$ G& x6 `
_ "github.com/lib/pq"$ j: Y% M. `# W2 y

' ~, i0 u# V! T8 W"time"
2 j5 a7 V# ]2 M' ~7 m! F9 U2 \$ W8 p
"log". c  U* I: M  J. c: p; g  j
# s) e0 ^4 ?& X$ P
)
; w/ W$ ^. w" T- ^! z5 E8 o, w& w1 {# t3 w
func main() {
) o- Z$ j; J3 e) n) M% r
( R# H! r' v* X. }" hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, K- d' R/ z5 Q% G* p5 H) O4 D3 @, t
if err != nil {% t4 S# f% g+ ~/ Y+ R8 H. _

3 S/ b6 R' Z5 F8 olog.Fatal(err)
4 t. R4 r, q1 ]% g( n' \2 P+ W0 y. W( A3 S- {# F) z! N' c7 P
return nil
- w  u# @3 ]/ y( y+ L; |6 I: \3 r
/ Y( F- x7 ]7 y8 C, a9 W}
. @- r3 ]0 N8 g2 j/ f' g3 e9 ]  i
7 U" c. {$ M5 l& M0 W% jstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")5 E3 L3 `2 `0 V) @9 A( \: f

; [6 w! @; {! M0 r1 h: d: q+ Cstmt.Exec()- K4 w+ \& J& T  T  q1 B6 Q
' {2 [8 W& w3 t  Q+ J$ a
stmt.Close()4 c3 S' Q' {: ~0 d+ t6 k% N0 Q

! m& i; B5 ]4 M& r7 H}
5 X$ b4 H/ `1 z3 G. S/ s  \  G
% x) ^" g5 C! X$ s& i二、数据查询 - SELECT$ z3 v) A3 O/ U8 \5 x" F9 v
8 y7 X/ o. k8 o% V
2.1 : DLang 查询数据
5 k9 n$ M" y. S! ?$ l% j7 @7 I, y* @" p+ P( d( e
import std.stdio;
) p# l! G) N0 p: E$ b4 N$ t' Q7 j0 e
import hunt.database;' _$ K$ F+ c4 {/ ^1 m
8 K- k) y8 ]' I* ~% F% l" g8 m
void main()* l$ R6 K, C  m& a) E  f
! e9 V  ?& o% H( d% r1 m% X
{% l9 K$ V& l  t7 d5 k
! N8 J: o9 R5 v6 j' B' o3 y6 b
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; g% ?0 h, \, R
* b& Z# n/ j, }, p) ]
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
+ c1 w) e  a, L9 S
3 d# Y) \' h2 I" P4 k' B) M{
$ ]# h6 r+ ~9 E
2 _4 U9 w' \* f& Y4 X% n5 c* Z% y/ Owriteln(row["username"]);# m* u, ~" y7 j5 Y  g

( Y) r% y: w8 \2 j: O}
( [, O+ Z# u" D, f. ?" ?  z+ p
# k0 q0 Z# E# Y! Sdb.close();
  K. f" {: S9 B2 {) R4 s$ s: O' X/ Z" C
}2 n7 ^( S1 q  _; ?  ]) e
- ?/ \4 z( Q, w9 x  ~6 W: E
2.2 : Rust 查询数据
& n% j7 U1 a' e$ A$ V9 }$ O. ]2 j! a9 V3 p
extern crate postgres;
# e, I# y: n+ ]; E1 E5 F* a' w
1 ?1 \1 [; E8 S  zuse postgres::{Connection, SslMode};5 F3 z1 \( Q, ~, w' S1 R

1 h1 l3 c( h3 y8 w2 n) qfn main() {1 f* p& v% x" k0 h1 T1 X

5 F6 S1 ]& O) X: X3 w" x! g8 W6 Wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
* l# i% C8 C: w2 e1 ?9 M8 q1 R) P
for row in &conn.query("SELECT * FROM user", &[]).unwrap();5 L5 Y% T+ o3 l8 I. K3 T9 \

' I/ k8 _; Q" Y: t5 X  iprintln!("Found person {}", row.get(0));
8 X. O* c+ G$ p8 G
  y9 t1 D; J( Y) g}
, Y- o# r2 w) g  E# O, ]* R( A" b! c2 C% V
}% w; E% U0 t- X# d1 n* L

1 r5 O2 T6 R# g. K, @' k0 ]2.3 : Golang 查询数据: Y" K$ |: I' }) T. r
2 w$ V& w/ U6 k; y& B/ B
import (0 ^) ?; i4 f* ]9 D0 R

0 u; G$ }9 E/ a"database/sql"$ K9 e0 B+ g( c+ d
/ x& D# O0 e( {7 g/ A
"fmt"
# n% j9 D# H" ^* s) F& b# Y' g% f. d  w+ ^: z5 e/ W( D$ K( h7 ~/ L
_ "github.com/lib/pq"
2 n- z  p# I/ b; n6 {
2 O8 B6 A2 P  a+ Q8 l"time"/ J5 l; f; ]- ~4 s; V' O" ^
2 r: L; |5 \3 Q8 W  x
"log"
4 B/ Y) C" R! l; ]5 v7 X* j5 T% ?; S1 [: a* U! n
)4 {2 A& S% Z6 f$ }  V

2 s. X5 J) I/ X* Z, l( _2 P2 |type User struct {
% C2 G- W' Q3 w, t2 U
6 ^/ q& R) {  p1 Y0 ~UserName string
/ g6 Z3 |6 D% E. d1 R7 g1 z" q' U* \4 ?- u. }% D
}
/ V, e; @" p. ], \! B
$ T9 \" Y2 T: \% b. b+ A; k. ufunc main() {
9 [: S7 D8 C' w; n6 a6 U
" \1 k8 a3 q; x7 m+ U* d2 ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")2 I4 g* a, f, G2 ?9 D9 [4 r/ A; k
! h  O. v2 m& z. i; ~
if err != nil {! R8 A  {! |' M6 @" b# F
& x1 W$ |2 w# F  R' l0 U3 A3 J
log.Fatal(err)  B& `. |3 B% G
# @* o3 P2 B' j) M; q( W/ x  s0 L
return nil
+ T' e" E" r- I% r, ^! T
6 D) ]* R9 K& c) u: m" S7 `}" o/ r! C6 }& p8 ?5 Y

5 C2 y/ z0 b6 huser := User{}2 j" y7 q- _7 R$ \9 p) Y

3 l- k0 K: N7 U5 d8 \$ x( [! Y4 vstmt := db.Query("SELECT * FROM user")+ }. X1 t9 `( ]% N7 O
+ z- x8 ?1 V' \. r
for rows.Next() {0 N) g0 P: \: I! c. q4 E$ {8 D
9 N# r4 U1 K& C' @5 _3 d  s. s
rows.Scan(&user.UserName)! J$ I  {- O3 p/ G

" w& F5 W5 o" D7 i0 X4 b" v; a0 ffmt.Println(user.UserName)
& ^6 ^9 H) a& w, O2 Q; y
! t4 q! c* @) \% ]}
0 v# x4 r& Z$ r8 |/ T3 C( b: K
- v! s! h- v! o7 t5 Z4 d( Cstmt.Close(), L: I5 ?. Q2 j& g0 C6 }8 F6 G9 N
# e. ~& Z9 N: b
}0 B4 i# I: y2 x) V$ Q$ ^9 i
' C4 d$ \) o% l8 }
三、总结
( G% X' G0 F! z$ u5 M& _* K+ Q. r
1 }. E. {1 O* |5 u1 P$ Z* R* Q对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。2 u* i7 y/ X* _8 M+ b; v; ?% L: i' c
; u/ y" C% T! Q2 A1 g% s
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好): M9 \6 i3 \$ l. i
8 b+ m$ ~- P2 h5 E5 O, H
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
, @! \/ |! i/ ^. y* h6 Q2 B( ?+ d  L( Y9 W
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 P! D( n/ V  L————————————————$ M+ n/ Q9 C3 |' w/ \  ~" ]7 d' o
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 g; ?( ~! P- S% {! f4 |: p8 d原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961/ n9 w  k  e. U  l, o

! _3 t- }+ Z5 \# i& R  G$ |3 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 18:13 , Processed in 0.162657 second(s), 19 queries .

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