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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

2 `  N! u. J* ?5 u一、数据插入 - INSERT" {6 K$ @  c5 l

4 z+ [* m: j, k$ W. \) i1.1 : DLang 插入数据3 G+ A& \! x3 d( k$ h. n

! X& |2 G$ r$ F' A% j' Gimport std.stdio;
# Y, E, A3 F8 ?3 B+ @2 y0 ~9 w" x9 b0 _! J+ K" O. k
import hunt.database;
6 a- j9 K+ q) l% W3 F  C: G5 m) ]/ ^) ]8 Z5 U! }! o7 `  \
void main()7 K8 |( m: u2 _1 |

/ J$ [2 b' @$ O3 ^, q{# b/ B  g  y5 G; f9 n4 i# X

' n/ u3 q- e& k: f. \6 `8 aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; m* G( l# Y0 x! O' V* T8 M% y. W
5 p5 k* X$ |. l1 `/ D
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);3 U1 C+ l2 J" z0 O7 |1 v/ f6 d

6 g  ~$ ?" {# i$ A( B* U/ f' p// 打印插入数量/ ]* `( m  F2 ?
- Y, I$ T1 T0 E2 _9 O' ]3 _+ H
writeln(result);* |7 k$ p+ a& n- Z+ O' [' S

+ C  {/ |1 S! N" pdb.close();
$ G1 d4 ?( e) a6 O5 ~
. z. \% ^  h9 j3 K4 s}  M. T, S  a. H
1 H2 s% o- f- E+ A$ b, }
1.2 : Rust 插入数据, _' z; O: _9 ?

2 P) n9 Q% J9 ?extern crate postgres;
8 U# G# E' v* T- e
  R9 w, N7 @, o. M( Q' z- iuse postgres::{Connection, SslMode};
9 X. M; \/ c0 d) ?/ _
1 U: O0 t+ J7 F, T6 c# nfn main() {
& ~$ C! u/ ^- G7 a4 o4 E7 }2 G. Q+ T3 a# N% p
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% M% ~# f. e6 h  J; W! t

; Y  k! ~  X* D, q# i. B# M  Vconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
3 H% E& h& a0 F. i7 K
% V; z$ s  i- q0 N# U/ o}: h1 [# z- W& M" {
! M8 o" ?  e! _8 c+ j: w
1.3 : Golang 插入数据" M4 I+ z+ a- J$ p* C/ `9 r

3 m# L. \% c/ U1 ^, S3 S$ D; r! y) vimport (
( Q# L* s* ?0 F0 m" f9 r
( l( Z! Q1 r  z8 _5 {"database/sql"* P/ [5 F0 E+ W% u$ s! b+ P

, x* w) Y7 d" w* E4 k& @/ c7 l9 ^"fmt"
& e+ @5 F3 N0 ~, a& Q) T( Q0 s- |+ i1 [$ e. a
_ "github.com/lib/pq"7 A5 n0 v# Z& j0 W5 f* c
" m$ x. r  ?& L& z1 r8 ^
"time"
9 P" v. O0 @5 v" @1 o% _" @' s( P6 K# V/ D7 `3 e6 C
"log"
! y+ r+ o& p* A1 \) S0 X- q, J, i2 ^+ X" j# c
)$ W0 N1 w9 M) |' [8 n/ n

1 ]& d0 n  W9 r. Efunc main() {
" i* K" _% q' p  D7 b. b" F7 t
' ~+ @% X9 e" q$ Ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, c" o9 G5 U% V; a- I0 p" T7 y/ Y7 e7 r4 ^( m1 F
if err != nil {0 `+ \& B6 R; E; e) A" p6 f* P  j
# s  d4 E1 |& I- m
log.Fatal(err)
; ?) o; D! u5 n5 D
+ [9 w% Q5 F" I- z4 kreturn nil
+ [" j) n5 ~- j  L, C9 m( J0 u& h9 v* }8 z% e+ F: D  U
}0 h: e# S4 t. `- E, l

3 E/ n9 N$ a( I. j4 e3 ~stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")2 b: q1 w  U- D: Q, u

8 J) \0 K! M9 {9 b! ?stmt.Exec()( R  P: V! }# S  J5 q; t* W

% v! @7 \! U; zstmt.Close()
7 z$ Y! k- ^, X5 Z) e. T0 {( f& Z! ]6 N. V* J
}( |6 g5 \& o& k$ Y' U6 s/ W  S

9 \$ @. w8 E# ?( G# ]( m  {二、数据查询 - SELECT  E. d7 _3 n2 A  M; v( i# c0 \

# h- L8 |) y* l4 q1 e1 e$ Z2.1 : DLang 查询数据
+ R, r( l! G7 H4 D% |  b% v& C% k- ~2 P& r2 A
import std.stdio;$ N# K  E4 e; Y" Q5 V8 P" f! r
6 ]$ H. G7 z" g
import hunt.database;# t" q4 @2 P9 s9 W. `* c
& r. c3 P  T! d5 ~; w. X. m
void main()% i: F+ W! ?* ^" ]2 X  \0 ?" q) v$ ^, e

9 M! o' I, W7 O/ u0 I{3 W6 m! I1 q* Y- G: n
6 E7 X9 o" P1 A; S$ ?8 a, }' R+ `
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ {) U2 C: S/ {0 P+ j. C( y6 o+ g; |( V
- [0 u8 K4 M* ?( T
foreach(row; db.query("SELECT * FROM user LIMIT 10"))) Q; b' X8 _3 K2 r9 l9 t+ q/ I0 s

5 ]. V1 E8 o( i- p, R{
! h* k/ U+ }7 T8 x; v/ f7 A7 W, t8 h  H3 T
writeln(row["username"]);
" @% P! r" j: d& d' n  H9 b! f7 N' e2 J1 Y
}8 Y  o4 r. r( i; w$ v
  A. e# O5 W' T: o6 ^- \
db.close();
) s5 V* ?6 R  F. l, |% V) H) V8 R
1 V$ c2 I# |- z}' x* v7 Y8 [7 I' M3 l
; r, V" J+ w  y" a
2.2 : Rust 查询数据! {' B: H% T/ d3 d

+ k* C3 `- k- Iextern crate postgres;
9 {, f; b3 J8 s5 T- d$ c  y$ L, p( q
use postgres::{Connection, SslMode};
/ s/ q3 `2 `# L. B% E
$ \& m* s& ]4 t0 kfn main() {
& B9 j/ I* t$ L7 O! U/ U) u1 S% X/ o) x3 ~, t
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 r: ^0 [7 Z+ {: x! ?+ D6 U  z4 {( [9 }0 U- X: J8 J* N
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
) F# w! E4 z* a: }$ p  m; l. ]0 G% z. C  f, K5 h
println!("Found person {}", row.get(0));
! C# U4 `: _3 d2 [1 e) m1 d6 P/ w* h* c3 E5 i+ y' }& h
}7 }- X4 \3 b1 b- A/ S" j
$ H# a- g$ u! W/ N1 i4 G
}4 G0 A! J$ k- y: Y$ G+ A4 I

7 Q2 x/ |5 ~. ~2.3 : Golang 查询数据
. @8 [! F7 w% D/ B! M- M
; [. d  r* @" simport (
; t1 N2 Q2 {4 L% f
- `7 }! q( A. k- t"database/sql"5 ]9 }2 E' n7 i

& q( Z- Q% n5 @, E0 J( S( x4 J"fmt"
. X) h& o5 d- m2 ^9 W8 W3 A  ]0 [& Z
/ z9 y9 F. n( `3 [# I5 \_ "github.com/lib/pq"( ]& a4 J; E  t% D# {1 |: _0 F- j
/ }8 O1 v7 _2 O4 |5 D
"time"
0 k" s/ S7 S$ |9 K) c* e
& [" s- P2 B: S8 k"log"9 ]; v( U; F8 ^' P

- h1 v6 k- F$ ]' G: p# h( W)  U! S. [- k5 n6 X" C

1 T9 {/ b' l2 X% W$ ztype User struct {
, |0 U" J+ [: k7 z, g' v
& J8 M/ \5 N8 N6 h& ]UserName string6 Y' Y* ]$ \8 X3 h4 X' g1 s6 v" A
7 Z: W) n. {! N/ S5 |
}
) I$ ?3 r8 ~1 f, D' e
5 Y* {( X# g$ k" I# [: Xfunc main() {, r# [  f) {; ~/ j
  a% I. b# ^" g% V; `
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); L8 p: J; P* o, }: ?6 ^3 ?. |* a0 P

8 e" @6 `$ v' i, ]if err != nil {
. L; h( ]4 p  C6 ?, q, l& R
' ^$ a) ^$ X. r% E3 W/ ~7 Llog.Fatal(err)
2 z+ E) O  J! h5 o. c9 o& j7 a  o7 O8 A$ X, G* W
return nil8 E6 O7 s8 n! s: ?' {! l
8 z* X+ D7 s5 E, W6 N
}' O9 Y. Y, \9 r9 D  w

+ ]$ v: ^7 Y7 u* u+ [6 Yuser := User{}2 Z. Z" I$ o4 B- _2 e$ y
1 L9 ^6 D8 {4 ^8 |
stmt := db.Query("SELECT * FROM user")* Q4 I# f4 f# R5 @+ Z

0 Z# R, ?8 P; r6 dfor rows.Next() {/ j4 |" h& y3 P
+ X' x. o3 i, A: x. q
rows.Scan(&user.UserName)
# l! i- n- ~4 d$ T: W+ |) m1 Z7 D! _6 `5 V
fmt.Println(user.UserName)
# X7 E1 P2 ?8 V7 y1 Q  u8 {! u. R. V1 t. [" n7 I" p/ ^
}, p- ^2 g4 v3 E+ w) Y
: a2 {5 k1 o6 ]% u
stmt.Close()7 I. n; b# l. x" U( s* _  |

' x! L; o+ ]7 }2 Z7 {}7 \- X+ v  o4 T3 _8 b! p. A

9 i; w& X8 Z. w5 h( I) M三、总结
; L3 [7 d; X6 X6 n. `% s& ?; A* z8 q- V4 ]8 j, }; ?
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
. C5 }# |5 ?9 @& ^' a' [& O1 }
) ^& D6 d$ e9 X这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好); @# ^" G! i9 p- }2 K/ y/ N5 H+ H. r

# y. W0 G) `# k% m在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
6 Q, A+ h8 z1 O% D( x% f
- |) H+ A) ?! K3 A, t- D+ Q* ]总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 F+ q) k/ T2 S+ x  I  v2 I2 f+ z2 B————————————————
5 y( A# ~$ u3 F0 Q: N版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" b1 y, \& |2 F原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
) t' G. r+ F+ s3 |: a9 T" n7 t. f% X  F* r* |3 ?- |0 U' Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-21 23:04 , Processed in 0.122192 second(s), 19 queries .

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