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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

' q4 g7 d2 [8 t" F一、数据插入 - INSERT& _. r8 }  X/ C) y! }
* [2 f& K0 ~* w' ?
1.1 : DLang 插入数据0 F% B0 q  {" h0 N2 U

# q) F0 J+ i+ E3 E, Wimport std.stdio;
7 |+ L/ R" w8 v& D( {$ b* a3 @0 u' x8 d
import hunt.database;* y; f0 E6 {+ t5 d5 W; \
# D0 e4 v6 V0 K. z
void main()
% e7 W7 j& U4 V: ~+ ^: W2 R: w% |
/ g+ r1 b# m# Y5 P7 L, U# i{8 X3 H9 K" u2 n/ ]2 ?  f& P' d% ]

- O- z8 g9 J9 ]0 F' W6 ]) `( Kauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");1 m# I" I' E5 w! ?& I- c
) B4 g% C- j; X
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);7 z5 L( K; s) M% B( C

' r" _/ {/ ]! Q8 N* f5 p// 打印插入数量
) X) N1 W8 m$ `6 V4 M5 T+ v
# {: ^8 i9 Y7 Q- ^( P6 I+ u: B2 [writeln(result);
3 m% u* f) P# g; ?, z6 n! h8 m" D8 R% T& _( n/ J% G5 S* D. f
db.close();" w# \# ?4 t/ [: L- h  g

4 O( }& Y8 V' u% S" p/ Q}
& z' D7 M! ?; A$ e. q- O) ~0 d; s7 j- j
1.2 : Rust 插入数据
4 J+ v) _% h6 ~5 A: H2 K: l# F) R: q6 V1 C7 R0 Z+ l4 P
extern crate postgres;% P$ ?& V& I# o& g: z: s6 |
1 n! e* q. Q3 i" m3 n" j
use postgres::{Connection, SslMode};
: P' L7 G- V2 V9 B! w2 o
( e3 F0 T. [! T9 |1 G2 j0 N* kfn main() {# {! v+ d' G- q2 V
- l$ _: t3 p( g
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();) }+ `# x$ d* f+ i7 `0 m
9 L3 v! S7 [6 ~1 E1 J, \- o
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();2 h& O" x8 n! k4 M
- e/ D9 O& e; z
}
4 l/ ]. k: ?' s) _. `
4 E$ R4 V7 E4 Z" ~- n4 p; _1.3 : Golang 插入数据
- I% D! `3 y  B( d5 }  H
! ~, s% S) G$ C5 x- J6 n; iimport (, c/ z; t& o2 b/ V

. e8 R4 E% N# `5 V3 ?* e& E- y( [# B"database/sql"
, z8 O6 k! w) w+ p' n4 b% \
0 V+ S) L5 s5 ?+ Q& f  w# @# a"fmt"
3 {3 I5 a6 d* U' c1 v- j8 `& Q% [
: h/ F& ^' \0 J9 V_ "github.com/lib/pq"
" c) l# I( w5 ]# A- y3 y* j. m- s8 t8 y' ?3 @: G$ x
"time"
( q* \4 B: J: z  Z1 O6 a
4 T; k# ]8 D! i"log"
$ X5 i, }* F5 ?  W
2 L" S# Q& h, ]: Y' K, A)9 V/ G) Q* [' {% _/ `
5 H7 Q+ @& H6 m; u+ U; @. h
func main() {2 c2 R0 `" Z2 o3 m' U
7 G( W: _; e6 W: O
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: I: p* Z0 C0 a! r" T  p/ j
8 W6 N7 c! @3 [* B+ d8 Qif err != nil {$ m3 Y2 v- L" R- W: ^

5 f: ~1 t1 r8 b$ n1 l- o0 qlog.Fatal(err)
: I( O5 C3 S: w( C5 a/ q
, M0 q- z% ?+ z7 i6 m$ O' yreturn nil4 |) N4 y, A5 r! o* t: U

4 Y5 p% g% }7 I( ?}& ?& ]- H7 `( J. v; G/ D1 q
9 |; e8 J. n/ m: ^( q( p
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
& h2 @9 V  {% Z! c" A9 P3 y
4 s* }6 e5 t+ y4 q9 rstmt.Exec()
1 F% P9 t1 x7 }- E: e. q2 X* k. N+ F/ `" M9 |
stmt.Close()
) q# V- Z9 Y4 H- q* t( f
8 p, I1 B8 S+ }0 M7 T: u7 I& ~! V}" h; Y: n$ @6 s

) @+ Q6 I8 j5 S. o6 l: U二、数据查询 - SELECT3 m  z; Y) g8 ]+ v
$ C+ p; ~( o' w/ e
2.1 : DLang 查询数据: F# K& d0 c6 G' Q+ ~0 r

9 _6 ?+ \) V% c1 J' A- c/ rimport std.stdio;1 E- {3 K' g7 y# U
" E1 k( r% [% h6 c0 ?0 G1 ?
import hunt.database;7 a) |5 w9 p) a. K
; x: C. X' O4 V2 _* @0 ^
void main()! y/ o. S* c+ ~

! Z' ?$ I' p9 w7 e7 p" X{
! {- f2 ^# J  `# @2 m) K3 w2 b% V- p4 [
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
+ o  s. t0 v# h
6 ~# E, J1 f% Oforeach(row; db.query("SELECT * FROM user LIMIT 10"))
6 {# J; b" c8 a7 Q
+ O" a+ i: O/ m: l; R8 R, M{
; k& v0 N* ?) @. L+ l0 l
( R1 n! X7 Z8 l: N) a+ @5 C! i" ywriteln(row["username"]);
" n+ n  H0 t: F8 q3 P1 ]7 g% A0 E* N& [+ O0 W  }, Z
}
( W5 \9 ?' F' D) m* l; i/ u* Z; a# q# g* g
db.close();3 B( f& R0 ^0 d7 E* y  d& D
8 Y8 N( f8 S4 K7 Z: N6 B1 P3 U
}, y' o6 ]' H( X$ i" ~

3 i5 `' s+ r" [+ Y2.2 : Rust 查询数据
: Y8 f, Y: x) P
% G' Z* P1 S8 @$ Y% x' R8 }extern crate postgres;( \! h1 p. m; E

9 Q, s* L: b8 b0 ~; k$ Xuse postgres::{Connection, SslMode};6 ]7 M3 @+ B. ?5 a0 `- p
6 e3 W7 m0 h8 R
fn main() {
/ |4 K2 R: B. U5 ^8 u& L( d' }% L) o
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
. ?$ |5 S! E; x/ Z) I
8 }: b4 ?+ Z' [. s. Ffor row in &conn.query("SELECT * FROM user", &[]).unwrap();
: D  M' p; B% A
# i, G- Z, u6 \! J" sprintln!("Found person {}", row.get(0));( N/ ]1 `0 n, \' o: p

+ h- Q$ h' n" T}0 n8 r8 A' i) o$ K! p. i' I: B
7 T5 \2 E9 U1 X* b$ N6 {
}
' b4 o5 Z* `4 _( P
! E, n* Z  L4 {+ ^; ?- p5 T+ ^& b6 B2.3 : Golang 查询数据4 f% u* S/ p1 R0 j. b
+ V* s; A2 u  c/ q* |; E
import (
: T) f3 y: @$ h( M/ |
6 T+ ~2 j0 \/ L9 d8 p"database/sql"
  }& r2 G9 K! z. B, N6 C9 c7 ?9 w0 U. V" K" r3 l7 ^) x
"fmt"
/ v: k3 o$ x- P( G2 h1 M* F; R9 S
_ "github.com/lib/pq"  m, ?% D% ?! j  S
3 ?; M5 L. c  W0 ^0 e
"time"0 y2 V( [, ~" X, w% }( l

; v5 x% e  V/ {: k- T) p( y2 \5 x"log"# ^% Z8 Z; _& U' y/ c1 n

% m+ J8 \/ ]# X( E2 t, b)3 Y. ^: ?' A4 I# d& x  S# `/ Z

4 r% Z  g4 p( r8 h  b* u" Ktype User struct {
+ ]3 g5 k/ H3 z- N* S) ^; w) O4 i) m  u+ {# K) w. ]7 D% t
UserName string
& D+ `! A9 w) W8 S: `+ ~% g
( ~4 O1 b2 A7 S) n5 a}* ]+ N% y5 L, X; E

" J- X; _4 O, E/ x6 b$ ]6 bfunc main() {) `! W3 k" u+ T# S
; X) d1 i% {* _
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); m: c' y9 U& M! j
( L5 \+ p3 e  f* \0 _6 E
if err != nil {
( X) [1 p) S! N# k1 M; F8 S, P! z5 d/ @- d# @  t) a% f
log.Fatal(err)0 D3 N5 `! J+ S, R* l
: J5 [% q: O9 |1 G1 [# d
return nil/ s" Q% \# e1 a1 S) t% R+ e8 x
" G# x0 ], K* E* ^; X  _$ i
}
; ]; E) u9 M) P3 D( n! d
" B7 W7 d* f- E$ F2 w  ~4 |; ]- duser := User{}
5 Z( o/ r9 O( H* `
5 K& c7 j; P/ Istmt := db.Query("SELECT * FROM user"), V9 X3 K3 C, W& J% W

" m: z* d4 C5 Y. e% L: z8 t- Ffor rows.Next() {- v5 R5 d- u- @# R4 f

8 G" j( Y; T7 ?4 y' `( U6 V! Qrows.Scan(&user.UserName)  a+ _: @: @4 p( {2 y

: b# x( x! [5 A( w# `9 gfmt.Println(user.UserName); v4 u8 |8 f/ l5 k" a; I% D; V" U

5 _: h/ X% C9 Q: f}( ?  p) X, ?; X

. Z6 c' W+ M! h7 K* Mstmt.Close()
' ?; [- |% V- ~- X" [  X; m- h, a& @2 s  u) i
}
. ^! S* s2 `0 Y" G! d1 B
) p  q1 L5 ^) P2 s" v4 N4 a5 |三、总结
/ Z5 R- N% {. g1 x  C, K
) ^- }* \4 n0 T) o! q- [. f  M% f对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
* c. f, d" ]* }
  x7 W' ]3 N/ V) g( M$ K4 H: r" m这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
% U( ]3 d% V+ {9 i3 Q+ E1 w4 G
% H4 o0 D3 g* g2 A& v8 {在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。  O! A$ _) n& ]8 c1 u
( O3 O+ W5 `* H$ g8 V
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。- s. ?; R+ h. \% N9 x/ w
————————————————
' f. [$ w. z% @0 H' C) x  \版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, T6 ]  \: }$ j$ n- W原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
) R- C- C3 z3 W6 s0 h/ ]! j+ q# D( b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 20:49 , Processed in 0.057110 second(s), 20 queries .

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