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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
0 }3 t) d$ y/ M' S! v: h: q) F4 R# b) b: U0 ^# Z2 A
一、数据插入 - INSERT( R! M; R/ X6 r  R% Y

' t1 d9 }3 C! l2 f' ?1.1 : DLang 插入数据* ?' b. G4 q: |

+ G* E/ Z! |# j7 i' J- q$ E6 }$ mimport std.stdio;* h2 }0 T' B: D+ j/ T
. a% z# e% Y  p1 f. x5 o4 p
import hunt.database;. k+ v$ m2 o. ~* c) s

: D+ N8 r$ V. {+ p) O; \5 W& ?8 R3 S+ P+ z" _void main()
2 p0 H  w8 D6 @4 U) K9 w* V
3 H7 [# b7 h# l- D{
& Z) E2 L: O2 d. F+ m
9 e1 i: \! R* ]1 [, ?7 E: E( Jauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
& W  d# s: j9 _8 F5 _, g' Q' y1 I
* a5 l. w# q7 ]int result = db.execute(`INSERT INTO user(username) VALUES("test")`);( q) Y# Y7 ]. s0 {( {0 W
5 v5 n6 N+ X& C( b) \9 l8 @& T
// 打印插入数量: C; ~# z" K" b, Q" a  D! L
: x3 q+ l' p9 g% U
writeln(result);9 [" w; f, V) C7 W8 a2 k* _

1 c6 f; ~5 k* r7 tdb.close();
7 H. G/ [* B- k+ Q' p: _1 q2 M8 T) c" o% j  M
}  n/ F8 ?9 t3 X
# T! b- J3 J! t3 C* z0 ]+ q; }. d
1.2 : Rust 插入数据6 b# x3 [2 o) Z2 F' I1 V
" s$ K# C3 P/ S4 K+ m' x
extern crate postgres;
4 ]6 B' N6 v" p
# P( z% I- A& x. m# [use postgres::{Connection, SslMode};
  O2 ^% X$ }# {7 O( Q& C! Z( A( a1 _
; g3 i0 U0 R0 D" Cfn main() {
$ G" l' b0 B" I) @/ l% e
, w' R2 T1 f! p: Z: rlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
) V* |' }" o0 l) g
) |' S: |, u# @& T  n1 W* @conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();! u+ @0 D( ^( L+ w9 L
) H  q2 P; x" G: J+ [
}
7 M3 H# h/ V, P; F$ j( Z( O7 Z4 `' `; F2 L, }# p1 b
1.3 : Golang 插入数据3 B9 o) j7 i" W* J! r" O

- I$ D5 S; \5 S$ ximport (
( c/ t  ]; G- B% F; u' L! L6 M" w/ S7 _8 H
"database/sql". {4 [( B5 e. @- }; v& m7 Z

6 [, e+ l! A  b8 a/ e"fmt"  `8 a7 S& b4 O3 _7 T2 }

4 ~5 t9 X2 {$ H7 x4 u/ t* |& r; j_ "github.com/lib/pq"' w# J) V' e" b. \) @& o% Q
; z3 _- `" w% \
"time"3 k# H" U1 x5 F: e" t3 ?2 L

/ A8 z& ]1 Q: Y+ l"log". L" q* U5 ^9 d6 r" L' \5 f1 r
3 x0 e/ m( X  w, k. b* i6 x5 P3 v
): o3 K5 x6 X* f! s. ?8 g

, J1 O8 N8 U9 C7 p. h1 ]func main() {
9 q6 i& q8 V: }* u* \8 i
2 X- f, g8 M: ]2 _# hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")+ l4 Z, U+ B. k  r
$ s! f5 R  [5 z/ m, Q1 f/ j
if err != nil {
% e; n+ U, q* [" f0 q& o/ ^% ^+ E
log.Fatal(err)
# v2 ^7 y% g; A. [7 ~6 Q+ z! }" @" e% T, p4 f
return nil$ u1 {+ G+ }* A
% r( }2 d: R+ B! N* E. L
}: q. b! m: V& t- s

  C2 Z0 N% ]4 j, M. g* wstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")" D$ ^" ?# V$ u/ G

. e9 Q' g' \, R4 |9 istmt.Exec()
& X) L7 M6 h* v' a6 S& [7 d" W
; u9 `( q( J- U1 f  c: c% Sstmt.Close()
% Y3 s6 J% `: r0 f/ ^( j8 h- X7 D- [2 Q
}0 }4 d  y( Y1 E( ?! ]
+ i/ y+ H# [' s3 R/ h
二、数据查询 - SELECT+ H: y% Q3 E) I3 Z4 [8 }3 _
8 e% d0 q8 f, @0 X6 B& E8 @% r9 n
2.1 : DLang 查询数据
8 \) r5 m9 w0 ]4 ]* s% \
) V% |, M+ ~8 R1 G* M5 gimport std.stdio;; H/ e% D) F! @: y
$ W  R1 k; T8 }. a5 J; H" A
import hunt.database;
# C+ c  b3 Q- Q% h( }! ~( C* W4 }
" r) s- S5 ?. Jvoid main()
6 c+ o) {/ T$ M9 a7 s: Z# T
! Y- k! X& x6 X, T6 k9 w+ V{
5 c6 V" X7 j( G6 ^  x* I# m
4 k5 J8 H7 Z3 r: J; G1 O; E. k. M5 Aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ j! a5 x5 }1 b* {* B2 d: m. d, |9 a- Z1 G/ W6 }( o
foreach(row; db.query("SELECT * FROM user LIMIT 10")). H, z7 [4 p8 `6 B
0 x! P; P% k8 L" C) \! ]- F! ]" i1 f
{& {4 [0 `$ r/ w3 L2 L4 D5 U

, t/ K. e/ C6 @. Iwriteln(row["username"]);4 y8 {  r% _* j: [
* G; S; z0 u1 ?' J+ K/ B2 }4 A
}
9 M5 F) N, }+ M" q' K
) s4 ?5 v2 U5 \) |db.close();! S& D; z* d) [' {% T

7 ]3 u+ N& M7 o/ B}
. X1 G: x  {, @5 I  E6 g- A( y9 t5 p6 B
2.2 : Rust 查询数据
. M7 w7 e. b9 \6 N: I+ x. |
1 J: _  n/ ?5 w7 B; T& a7 Z" Bextern crate postgres;+ y/ H0 q" v9 U# O9 i

' v( t8 C. O" ]: _1 [use postgres::{Connection, SslMode};
2 O# g: R: [0 ?8 Z! B3 K6 d# G8 b7 z% b1 j5 C% l6 H
fn main() {, b1 Z5 k  _7 `9 Z
7 c; N& S5 o/ r! o% y# y' T
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
# p. [! M; I& Q! S: ~$ {- t8 I" Q) R2 H! h# O. i
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
/ a% M$ y" d% L0 D& J
8 ~. @% F  U/ V$ Z; f3 eprintln!("Found person {}", row.get(0));6 H! U) U2 ?* H

" m& b2 G2 n: t; H}
5 v5 {: ]/ g* a6 x5 _3 i
& C3 \) @; k% _! ^}3 `2 h- c7 B+ M& p# q; @
- v3 O  W% [) N
2.3 : Golang 查询数据7 P; X0 e1 T" O- a( g
0 w( ^" g' h2 z2 d$ ~
import (- b& K4 K* n2 z3 A  C

. Q( w/ w" Y% g. A1 t  n"database/sql"+ \5 S' q" N- s# d
+ S3 {% F8 W4 C5 w
"fmt"
/ R: Z9 |4 h4 H# o0 p! y5 d
* c7 h  T$ z2 ]( Z! @7 o_ "github.com/lib/pq"1 x7 t% C$ h4 ~

; x4 f% I' ^1 R: Z# E, C"time"
; @9 b5 z" C7 Y$ R* ]* B! \( Y) _7 Q3 H$ z  S, {) ^
"log"
8 h5 E+ a( @8 \: e7 x# L/ y1 i, g- e+ v3 N( t: d9 b
)6 h" I. `7 k7 C2 I
6 G+ G# l% k! j# R4 g4 F( p( r
type User struct {( i1 n" H) H1 }$ T( o! k8 [

8 A* X* a3 W: W4 N- s& S0 [UserName string
/ ]1 y- l  Z/ T& i& x4 Z3 B. `1 u5 ]7 f- P( n( V) R, _
}+ v3 K2 c+ N6 Z2 ~

* B3 m  y& Y3 y; R" U( `# I* [& _func main() {& p  J$ m6 E! \

+ r$ V" j9 ^; }& `db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
. s( i8 c! f5 m; f1 k3 B% C/ W; C: o: T4 V
if err != nil {3 [8 `, s& p5 O" R" _7 R

3 h4 H( O$ F% ~! Klog.Fatal(err)
4 ^" t: d8 X, F( N
  K& A9 o, C4 J# U7 ?return nil
! \5 P- D- R) H, a( ^5 F  H+ s% w3 a8 i+ v: [5 l
}
* Y2 G0 x. w5 B1 g. T7 x# @. @! x* p# p6 ~& J5 n7 ~
user := User{}
; ^; e9 S" Z% Q$ s; |
9 r# r. f/ A+ i$ rstmt := db.Query("SELECT * FROM user")
4 R' n, U! M. y
5 r6 q( A; t! U' G6 yfor rows.Next() {4 W+ l3 D' o+ i/ ^7 m

3 p7 O8 W$ B* }, e( Z' hrows.Scan(&user.UserName)
- W( G' ~* c2 \6 I9 U- b0 }5 z3 p: R) D
fmt.Println(user.UserName)
* j0 L1 ]$ N$ o1 W2 m6 O0 ^3 V# u$ R& ]& J
}# b* H( X& w) k6 v
" b7 F  T& P0 E) n+ f# {0 {" w, _
stmt.Close()# l7 \6 q; s$ f* j, b3 m! t1 P  v
/ o2 ~( a) M0 `1 M
}
( ^& b" t/ v( U' Q) z, k5 R0 K) ?+ m0 z% o/ N& j* t0 F8 c
三、总结
6 R2 w5 n! n% e9 ~, @3 Q! x. O  N; E2 }" U. B% C& I" k- I
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
  {" {  ~* |7 O, y) g& g
' g: M, J, z( L3 V  @) {8 D/ h0 B) g这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
% R. c! x5 F; p- E: f0 e. y; `  K/ L: R
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。' q/ M6 y( C- W" F
" D5 z/ }2 ?4 U. o8 e2 e7 P
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
# c' }4 Y7 n7 g, F4 |$ n————————————————
6 x& L9 _2 o& m$ _* G版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; a! H, c4 A0 I- d7 e8 _
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
. a& p6 a( ]* m1 J) X( N- p( i  l' T% q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-20 23:56 , Processed in 0.055990 second(s), 19 queries .

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