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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
" ^: \0 K0 O/ `0 e; G% B! M! k- V6 V( |% D7 b: S
一、数据插入 - INSERT, s& K8 R/ k3 E1 n3 ^: w

" n: @8 o1 G7 u& R9 T# T" T1.1 : DLang 插入数据
: W( L3 ~, Y& E7 B/ i+ l% S+ D' E6 R9 g* e3 q+ H% K
import std.stdio;
- B; Q3 q: P" p' E& P" _6 B& @5 o2 D- P+ _' i
import hunt.database;
1 r, Q8 S- ?/ [" y1 U& I) m! W' M8 P) V9 j
void main()
; o( _4 m7 t% R/ _1 Q) m
6 m% G" q0 X+ }% d& e/ H{/ u% m- _  ^* z# p" ?* {

- `( I) O0 B# M6 |auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");* G  x  E" T7 l# g+ k. u

- v, c" X) v7 `  }int result = db.execute(`INSERT INTO user(username) VALUES("test")`);7 t6 n3 J5 n$ L. K0 h
, D# w3 F4 M1 f2 N1 L
// 打印插入数量
# S: T5 t% H( i9 d0 d' I" M# g+ B# w
writeln(result);% q0 g0 `- Z& v& i" w: \7 \
5 Q4 r% O0 V% K% ~
db.close();" M. Q  r) L8 e2 }4 d% |9 Q1 R

0 }. j8 P/ a) s}
- z% K0 M! k' p+ w5 j4 h* {1 `) ~- ?# ?4 ?/ ]( F* E: |
1.2 : Rust 插入数据
5 L0 {* w/ e$ H+ k. M
; d# q" i7 M0 Eextern crate postgres;
; \% L- z. ]8 o+ ]- p9 ?) h+ k
) t8 w7 u  v+ x/ d+ @9 t2 puse postgres::{Connection, SslMode};; C5 b0 Q- U& Q- H9 R) h
; H3 N1 T: X  J( P) \: w/ s
fn main() {
6 E: m3 G3 c1 e8 e. e3 S# `, O1 E5 t# M' W
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
$ t! a$ h+ D6 r* g, b6 c6 O8 m& K+ T+ o( {
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();8 g; o* Q- l& ]. h  \! X

# I  I- a" P4 ^4 H4 x}
( v1 N$ N, m& l3 U) i
# d. d8 l& V! J, ~. z0 y1 w+ L1.3 : Golang 插入数据
% _7 `: g7 N: X, N% t" s; T
7 ]4 u  s% Z3 m/ [3 rimport (
  M, D5 y1 K, P7 b1 F1 T  g) p; B8 O* p% i
"database/sql"
5 ]: u& }3 n3 u, f3 I* V& S% T( W( {1 R
" Y: t  ^5 G; ~. Z"fmt"
& |- X9 \/ B( C4 z
3 y" N+ b- z6 I; Q: Z- p_ "github.com/lib/pq"
, B9 V" X* j3 e$ c" J! Y9 N
# e. ]& f6 n. K  b/ a"time"9 m4 |" X; p: A0 ]

% A! e9 Y% J. h. {: I  w1 {"log"8 N9 _+ J" F0 P: K" B* ?5 t9 V

* G. q  j% g: |5 N" j7 F)
0 Z6 ?7 e: n+ [! S/ B# T
; \# @; B6 Z  S+ j& ^) zfunc main() {, Y7 o7 D2 s  C2 Q# ?# \7 V

$ ~- h$ [* H9 Z9 G8 U3 w1 Sdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, A( h; [+ ]6 d' S0 p1 t8 D4 I
& R" P$ z. a. D) h7 p$ f6 cif err != nil {" n7 p7 ?* }$ b# L9 F# y

6 E; t; I% e3 ]' q9 J, Hlog.Fatal(err)2 y) j4 b" W. O2 h( W1 ~/ l+ ~' p

0 q, j, P* |& W5 d3 O. Areturn nil+ q4 a- t& Q; {9 N
9 [# e9 x: ?3 a/ F0 V
}
  L6 g# w" A6 Y1 P  ]" x* O
$ z: R/ _/ C& Z3 i  Lstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")1 R; _* t9 l* t; w. _9 O8 c2 C0 K

% Y9 }. @5 H  L- T0 R3 k& hstmt.Exec()6 }* t6 p2 t  M! _
# L, j/ Y+ M; H* R
stmt.Close(), n4 E) j' ]9 G4 u% g& Q

5 p! {9 H. O* ^* A}5 A4 F# ^$ A- j4 C& @1 C7 l4 q- ]# i

; S1 v; {+ d9 ]( I0 I6 U* \二、数据查询 - SELECT6 B- E. q% t7 e, g  o
( h  e# r8 j3 t: g
2.1 : DLang 查询数据% [) M7 }% [0 w" ^) a
' J, ]# s. @9 O/ b& t
import std.stdio;
0 l2 Y7 [# [, N, u7 Y6 a
9 g* m, L3 ]0 m) B: b0 _* t2 Simport hunt.database;1 L1 P0 \0 G9 `6 U7 y2 v) q

7 I+ c. Y; W$ G4 s2 a6 mvoid main()1 O( i% r: O( I6 [& e

8 m# L2 L# o9 J2 a& ]+ Z{8 |1 F8 F( z% W4 m9 G, K

- Y8 Q, ^, w+ @/ h0 M8 lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");7 |1 x/ u. Q! Y$ H  e0 U3 V8 D. s2 A7 U
9 r/ H7 ]. ~6 @* T6 Y# x) ~. E
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
! u) C! }" M# A; ~4 `& y% d) n. |! l3 H- p; ?
{0 A' |; C) C) g/ G5 y

% V$ ]9 H- ]& e/ [" h# ^writeln(row["username"]);
7 f# ~9 D- h) U* C" ]7 V- k+ A, K- N2 J7 j+ P
}
8 n, ~2 p% k: [5 e  `& d+ t
8 H- f  n% ?5 |" z& Sdb.close();' Q/ K" P! k' P) B4 y( T/ u+ |
9 G+ b1 x/ F9 |0 }& a
}! Y: r6 W( |& ^, v% [+ R& O* d9 ^! S

' `( }) R- S8 a/ K* x* z2.2 : Rust 查询数据3 J/ y8 t8 M- k0 a6 X7 x0 V

7 L& x/ ~8 t$ eextern crate postgres;  z( |3 C5 {! X: e" A
6 t+ l) J4 w* B+ f/ k! w4 j
use postgres::{Connection, SslMode};
. L4 }0 x/ E  O: A
& g# M6 t7 |4 N) }fn main() {
( W7 |$ Q- G3 x! S5 `
: }! O4 z+ W# Q1 I% g/ W/ D  dlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();- U+ _6 ^/ g* @/ N

# [1 L# x! L+ A; lfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
6 F( c& I5 U* I) ~7 j5 x6 X8 ]" F& h. _/ Z
println!("Found person {}", row.get(0));. M" {# j* C, p2 }! j4 ]% j4 q) j

9 [/ Q$ ^; g" L. d- _! w}9 R% O! l$ ~$ I- k0 P& x
$ R) O7 r; W& x
}: _$ E6 Z/ L5 r% [4 k" [" p
0 }" F( V6 m) e& j8 Q6 D
2.3 : Golang 查询数据" l8 n& p7 R- k: N7 v6 w1 s1 M

0 v5 b- a/ }. qimport (
: B3 r4 e8 M1 C6 y% V5 F! V" c
( R/ M+ n6 \7 C7 |0 z"database/sql"# I, a& b) E! T* x
' r! N" t) p, i: y6 n; k& ~5 J" Z
"fmt"
0 A  W/ a0 K4 n: P! B7 h& i8 X: i. P" S; J: t
_ "github.com/lib/pq"
" d" n: B7 S& z& D8 }1 t: Z3 p0 j, P$ U3 w5 N
"time"
9 b8 e9 i7 I, v) Q2 \! ^2 v( k5 o! M; s' f5 [+ ]
"log"+ D. }2 v1 K+ Z9 M0 k. L  v

5 t2 ]" h( `6 x/ g* J)
9 h: V& D" w, E2 i
# X0 L+ [1 E; Itype User struct {7 c. O" W3 Q* g; ^3 ^8 Z+ x
) A; ^4 [; @* G% q: B+ }
UserName string  w+ p$ A# h& p6 p
* i, J2 {% p0 F
}5 A; V$ |/ S. a/ Y0 F: M( y' x
' `( O0 D- y3 l* i
func main() {
7 q' R  M) E; q+ b. Q* ~
* ~& F6 A% l9 O  V) Bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 h+ a2 v; K% D% F" z% U" Q! d! F
- W% ]( S- d1 ?# O9 mif err != nil {/ t, D$ @: M* r. b1 w& o4 |% H
; d% Y5 {! ^7 C9 _: [% Q* `
log.Fatal(err)
1 J  d* M; S6 Y( S. [5 o
2 Z( j: j5 v) P% K4 _8 ?5 u7 T% mreturn nil6 G; F6 J  D: n% D8 Z
3 @' ]7 [( [8 p) N: Q' c
}
# o3 ~, q4 @  x: ^& D: P' g  C# d; d4 N/ q& O3 `
user := User{}
- a# _5 E1 ^% I& k: h6 q3 N; B1 P1 w5 `+ y: i. h/ N: M. V- C2 w/ p
stmt := db.Query("SELECT * FROM user")
# g+ t; X0 {" Y3 ~' G* L; P4 s) Z- b) `- c6 G1 ^0 [
for rows.Next() {
3 O* F1 U% j: f
, q1 _8 f) u3 B3 m4 Qrows.Scan(&user.UserName)1 B5 ?! H1 ^6 q7 ]! d

. a6 B2 t- s1 E! j7 t* Ufmt.Println(user.UserName)$ U: u5 |. t: m7 ]0 B
  b- J4 e$ l6 y, L& m9 P
}. h0 K3 Y" }* c

$ z, b# A. e% h: ustmt.Close()( G1 L$ q* C3 ^% W

: b( V- L( h& e1 C! C}. q  e4 G2 _1 ~9 q
0 m, Y' l% I8 r# `* R
三、总结$ [7 Z3 h. l& u) I" P$ x" b4 u" W

5 l$ d- _* O. a6 t对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。2 {% W, U3 R: j- v/ e

; P) }6 H2 a" K9 Z# l# Y这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)" z6 X7 R/ T0 |+ F  c
8 X2 z; A; u4 e
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
" p- U3 O0 f( J, q! s) e. l) N, p5 _9 o' @# [. X; `+ r# K
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
7 D$ @- o' i6 V- s2 C2 S% u/ o————————————————# G$ b- y: b: a
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# H. U0 w/ W. g. V2 Q原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
& O2 R/ y3 m; b* |: |4 m( q; e" d  R. C; ?9 x/ E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:24 , Processed in 0.110548 second(s), 19 queries .

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