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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。, N2 q, o0 x! R! K" B
9 C, n6 j# q/ k/ t
一、数据插入 - INSERT
5 ?* u3 F, I# j$ ]$ J6 F- n2 B8 H! m% g& {1 q. M  r% x
1.1 : DLang 插入数据# _0 ~; L( k* y. Y9 k# E
$ C4 j; A0 V% m0 r  h
import std.stdio;7 n7 _6 T% I8 a! e" y

4 _. a" z, a  V. l8 n* f1 s4 himport hunt.database;
7 T4 s  g: n  h% l6 E- O
% I/ m' C  ]6 i- o  ?void main()! M2 V5 U$ f! l! G* C7 x4 j

1 {5 X' G( m2 a; X  v{+ n) k! j. Q& `' I) x9 I* X- c

  A4 V: m2 _9 g" w! T1 u# Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
/ S2 S* O" C" q6 ~9 K+ a$ C
. K* R0 A9 ~) j" G# Hint result = db.execute(`INSERT INTO user(username) VALUES("test")`);; t& T2 }& [6 y8 S1 u* [
+ ?' i) U3 @) s2 E  i2 [7 m
// 打印插入数量& q# K, d) h% w& }8 N8 f1 P* ^8 ?1 Z5 P
$ Q: @1 ?( \6 @& V  H4 d0 S
writeln(result);
  V. z: `; s$ T4 E# ?. ~! j! v& u* b# x9 w4 G1 s8 {4 k+ W( b0 y/ h1 E6 g
db.close();9 T6 d& s1 }! l. ?( a
" l2 U; P3 _5 V0 |$ A7 m
}7 W8 D! v- G5 p7 `

, ]3 N, K# \- t* n1.2 : Rust 插入数据
7 T4 I5 p  U5 L; G/ E2 x
" a: t1 ~# v; ]$ U  Gextern crate postgres;9 W8 m4 s9 X$ T$ @" Z1 Z* L7 u( k
% G, c8 U/ s9 J- N6 e
use postgres::{Connection, SslMode};5 M# ~- D' |, }' h; ^3 Y. f
' K3 x: M$ {4 {0 x+ ^/ o4 _
fn main() {/ \+ ^. d0 l# t! p4 m$ B- N

( J* ^/ P9 J3 ~- b/ |7 glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 F  X0 Q4 `# t- |. p, c: I: }+ I
# O5 z4 C$ d4 v& r8 Q3 iconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();7 J& F9 o+ _& M( w! U2 c4 C
* I* o4 A* S$ ^5 R: W1 a) ^, q
}
  t# e( B$ i: I" J5 q5 ?, r
. i; [6 z) L; i3 T, [1.3 : Golang 插入数据
* p3 t; z2 r& Q& P4 z: z) u- D& x! T; P  U, I
import (
/ M2 f6 K6 R- X3 |) _/ E
* E1 V8 H. b& ]. ?/ H8 ?: E- Q"database/sql"  n% X# W9 W' H! N' I

$ V4 f" I6 w5 o" _& }6 e. A. r( Y"fmt"0 c( z9 B2 D! P% C/ `# z/ J

  m' u: @" j1 Z) Y# V' J) \_ "github.com/lib/pq"
/ U- y" ?/ z! T4 r6 V9 I, F$ I2 X" U. l* b/ \4 q  q
"time"
. l- F- F+ e+ }# X/ q' H) l' R
& Q" ?* M2 j% X# v"log"% u  X5 `* N7 q$ ^- i, o( A! e% L
1 R+ W7 D0 v* X" ^& l2 u
)# n! l5 O7 o. p9 E

0 ]# `0 b1 r$ {- N% gfunc main() {
# J- V' C( O7 p
- F5 U3 q3 O. t4 F8 M) ddb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 _/ Y! e2 M+ \3 a0 \8 u% N1 |* ^; i! ^3 v- X# f! h7 i. O
if err != nil {
; B! I+ F: m( ~4 e7 J
! E0 N) v7 k; ]- s! @log.Fatal(err)2 n: Z2 B# V: U4 D9 K
  R* m6 f, Z  [: P* |. _: y
return nil
" D: K- D8 U3 l* O) i* u' Q8 R( I( \: N# P: N  V
}
! J. _" c7 }; r& M
3 `6 F* G  v( h$ Y$ _4 _, o; f; _9 ?stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
* E, p( C( J1 A' u. Z7 {( ?# E9 x' ~0 k9 `
stmt.Exec()  ^; g4 x; m6 W6 a* r  |& `0 r1 C
5 G, o; @- U' L
stmt.Close()
6 G: A. @& X# A" D2 ^2 ~# u# v
$ F9 F& e# z3 L5 |0 P- c) [2 s}
. j# S. v8 |  d' U1 ^3 P: j- x
二、数据查询 - SELECT- Z+ K2 {6 l- r; n( m7 c7 h# B' f
2 }* q/ {5 v9 }
2.1 : DLang 查询数据
' B- ?0 b: t/ w6 U2 _5 @. P% F
6 N1 |# Z+ ^/ O* q. E6 i8 R  simport std.stdio;8 b- s& ]2 n  v. W1 [, s6 C

/ T( G& f" H, ^# ~import hunt.database;9 K9 Y6 O4 g! p# v7 J" N2 P

! o# w2 t( P1 w( Qvoid main()1 Z1 Q0 t7 _+ s0 X  t: K! R1 X
' P0 u6 V4 H2 w
{
$ [8 n6 c$ b8 L- I. t( Y6 v, h6 s
7 p& Q$ b. X% r7 w; {: Dauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 F2 X3 D7 n4 _4 y& n
. I2 I( n9 L. m3 i3 ~
foreach(row; db.query("SELECT * FROM user LIMIT 10")); O" e6 J0 P1 R% w9 @9 @

2 _0 Z( n1 k' B{  N2 `+ Y6 m5 k; s- H

/ ^0 ]+ r/ s/ bwriteln(row["username"]);
0 D, N8 H( u4 V
8 O$ F1 W& D! Q5 m& B}
. i0 z: B1 Z; m# l3 D$ G' d2 X* a2 k
db.close();
7 K4 Y$ s7 f+ m# x
/ X1 h0 T$ k2 ~9 E! J. r}
/ p: x% Q# {, k  ^8 Y# N$ w0 f; c: k7 ~3 ^" W6 n# V/ |" D! I' @
2.2 : Rust 查询数据. o& c. i3 b  ]% U

! l. ]2 I9 o4 [0 z7 G. J. ]2 N3 r! Rextern crate postgres;1 C" Y; e' |4 T9 e- ]9 A# {% y
( p; W2 U8 @- E" g& p# }$ l
use postgres::{Connection, SslMode};% l* w  ^& I) z/ V

6 R8 e: p) P& s! Cfn main() {6 I2 T" I- j) a$ B

# Z4 S& `+ y. R2 Olet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();0 j; |* I: h' Y

7 y+ b5 B1 v. X: ffor row in &conn.query("SELECT * FROM user", &[]).unwrap();
" P: c" x  e8 B4 X/ v  C5 v& l
+ M9 X7 J) j# J9 T; zprintln!("Found person {}", row.get(0));  Z4 h. r! G5 {$ M
1 s, t6 A2 T# l* l" }8 A2 b* q6 ~" R
}' i! k( v& E8 X0 g9 S
& |- x5 f0 k1 r" `  T( D
}
5 Q: O6 X5 }. w. W, d, P
. X9 ^% I+ k7 \: r* R, \' x' r  N2.3 : Golang 查询数据
2 H9 v7 b& m1 }2 j- @8 }) M9 \' B. K- n% s7 N" w2 u
import (
% F/ X, Z5 Y" p: _8 H6 d; ]- }& h# L7 u% p& F
"database/sql"; v: \5 p% D+ O3 ^5 b& h
, [4 m8 L$ |$ E1 K2 U
"fmt"
( a0 J7 a9 U# g) J- q3 F" L
" x, h2 ^% b0 y' d& r) K_ "github.com/lib/pq"7 H* @0 A# S: m0 j8 S
  w9 o% {  O' }, |
"time", n; F; ^4 n9 h, K2 j

- P& x, v  z+ K( a: z  ]! z1 b"log"& ^0 B5 C- M3 C# }

6 L4 v7 m  z# w0 l: |)6 a: b0 _' O( L

2 A. x2 t& y& ]2 U7 wtype User struct {  E5 _8 y7 P* ]' j0 @3 D0 T
9 v( t! M5 I: i& v! ?6 p+ W
UserName string
% r/ x0 B' |6 X: C1 H+ t. A7 U4 T5 s
}$ v4 L3 r) n" W$ F

- |, {( a, A3 U  Bfunc main() {
! h2 k3 o" H2 D# o+ ]4 u. H/ x& z( b9 f! r# D' U% i) M
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")$ o1 ?3 I0 {- A* B- p
) e9 \+ C8 D+ D3 w; w$ ^" N
if err != nil {0 Y! Y* x$ F2 H) R* ~1 v: ]

- C: B/ }9 U+ _/ z% u7 Slog.Fatal(err). k( ]$ k: t- x* l4 k* X
8 l, f! M3 }: a+ m; ^6 L$ G
return nil
) J5 J# `5 N& C) g" t  ]5 }( M% Y3 _9 b& t3 l( o# e8 z
}- Y! g: x; i; {9 g, j0 ^8 {

$ J; l. P2 E- B9 ?$ f: Guser := User{}  T% W) {1 ]* C, Z9 g' O8 C

) g, F0 S) d* @+ Sstmt := db.Query("SELECT * FROM user")# g% C7 U4 E# I+ V3 Z+ J4 h

9 T: V5 ?" t- H- t! Cfor rows.Next() {
6 y/ D$ {' N5 L8 R$ t* M% F" G4 _( i8 i6 z9 _* d' w
rows.Scan(&user.UserName)
% n- {$ v: G- E, r) H! L
: S  c; \1 o; A0 _fmt.Println(user.UserName)
1 A7 M6 L* s+ l+ w" U
- B: Z4 [: @& M/ E+ N}' u4 U# B3 ^) r  L
' U6 i7 t9 S2 n" L$ S& y: m8 [
stmt.Close()) J+ r, m$ p5 z1 h  ]7 T
# h# A9 ^8 ~3 }9 h# q* y3 ?; M3 I
}  k! x/ \) n6 c, H5 C

. D3 d; L# N4 {- y三、总结6 R; e' _7 n# U5 j& z6 |2 F9 k% q

6 M& W5 W9 ^1 W- {& t' A0 o对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。; @  H% T1 S0 f. B
+ w$ j  Q5 o) Z+ E- ?8 x8 y  {
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
9 x% O' X$ y* w  Z) X1 e
  K) u" a( m' D! o" A% J在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。7 F7 D- ]& A/ R' h
, ?* x$ ~- Z" L& e/ Z- n
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。- |) D: g0 Q9 @" C4 T
————————————————0 n. B5 n, ~6 K; P
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' i- Q% L1 Q* _2 ^* Z) Z原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
% d, Z! V* ]5 ?
" B/ ^0 a( ~% s9 |% c+ J3 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-26 07:54 , Processed in 0.127701 second(s), 20 queries .

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