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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
' h7 r; d1 N. F& P- S: v  h
6 w4 q7 ?2 t, w7 m8 i# V2 V一、数据插入 - INSERT
$ Z0 C; Y5 H! K1 x
9 j& {' Y& n2 |, I6 G. T1.1 : DLang 插入数据
9 x5 H5 Z. Y* {3 G* {5 F# C7 l: F+ }: T- z3 L. ^0 l
import std.stdio;9 K3 |; Q# v9 {0 v# Y

  o0 p  u  F3 i+ p2 x' ]0 H3 nimport hunt.database;
0 z. c0 @- [! m- k' D' M' e& D  i4 ]0 g: A* J6 g+ h
void main()
9 Z  D# P2 z# e% l( W! v: ~7 Q* Y2 ?: `) D+ J' w# y3 h0 t( s3 N$ }
{
& w; j& v  ~) _; _
& ?3 X; G1 f1 {( g7 p$ d! g) V; `auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
, Y( h- m% T" z5 Q
/ Z, e# I8 b. }, _3 j- H8 Hint result = db.execute(`INSERT INTO user(username) VALUES("test")`);0 a  W# s  A6 y/ J7 f

7 m+ x- l! H6 ]" ?, I# G9 _5 u- |// 打印插入数量
: e7 E# p4 d  z# `4 l1 j! F
7 m7 C7 W' ]( h+ Wwriteln(result);4 a" f$ o+ }' G/ U( [
! a1 I; o/ g. K
db.close();
; y3 l4 Z* `% K* [1 C
0 }/ f: B; L/ r8 |7 |  I$ S}) q- k- Y: e2 K' X# J6 ]% g$ ?* y

+ |. a+ Y' _6 D* C1.2 : Rust 插入数据
/ g' t; J, Z" u- J9 x; R# I& {1 [) Q  O1 F
extern crate postgres;- h; A; r7 j+ Y, M- Z9 I- Y
8 Y: S' U7 `9 a; i6 k
use postgres::{Connection, SslMode};0 C2 A- ~. l- y4 \0 ?

) {, I& d7 n" A! }fn main() {: X4 _$ t4 `- }" s: F
* I  I# o8 x7 o+ `2 l: G/ m1 P
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 k- p# H8 W% T1 c! p$ h, Q! E! d8 q6 s6 e2 C
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();' ~( n5 |; N# q; [5 ^# ?1 i2 ^# i
: Y# E7 s, o3 W, A$ }& r
}
! s5 ?' `- R4 n% C% ^( N# O8 _& j+ K( ?
1.3 : Golang 插入数据% K3 [0 ~" ]( @" R

2 N+ k5 |& p1 p1 A# z' Ximport (' _0 L# E. X) Y5 X- d: b! T

9 [' v$ _8 Y; \. M) n' [& m"database/sql"9 E. u4 X! ?, w. }: `/ r
& H2 W3 G$ }! n1 f- U1 k
"fmt"2 h. N' |! ?* M$ D# V! [- w

- z( O) I+ e) e( ^3 u; M, G5 r/ v+ k_ "github.com/lib/pq", I0 }7 F( J; Y* Z/ P$ T
% n6 @0 h% C1 k4 D+ N
"time"
# T  ^2 [9 _) ~( Q3 t
# E& J  ~5 x- {" j5 r% ["log"
. y% j; P, O6 [2 Q) M& H: b0 d& I* o9 r
)
1 K; c: V8 C' r% @
3 h4 q  q  A! E* `& Ffunc main() {
% Y6 w2 w: T' S% A9 z
* ?7 K+ n" Z" P# M$ B+ k0 fdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
$ H  X; W+ S5 @) x4 P; C/ ^1 C- N/ H& N0 p( ^6 D
if err != nil {
6 _6 t+ O& ~) |' ^( n* |! q
% g" t& [! p1 q& M& Y, U9 u2 R( Dlog.Fatal(err)2 i! }0 a$ \; V+ i0 T# M1 q8 C

8 ?5 i6 K: X+ R+ z% ~return nil1 G! ?+ P2 g+ T5 _, e. m
& o$ c1 s8 ?% _6 i
}
7 z& W6 l8 l; M/ b) E4 G: G! h3 V. O9 I
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
8 [6 d$ K. r. Z
  ~" G6 j3 X( F/ |9 f9 Rstmt.Exec()% B& b) g! O- \

: g4 I" [; v$ W% n3 z4 Z. D' Xstmt.Close()
$ K* z$ k" |, b1 D2 ]
7 h6 Q/ P8 b2 f9 L( d7 V  U. I, ~0 b}
/ }, X' f, w  x8 l
+ [! [# y1 [' F2 c二、数据查询 - SELECT
9 _, d# {1 X8 X1 h& I* Y3 ~. A, Y+ r- k) V% o) x& @! s
2.1 : DLang 查询数据
: ]' q3 m2 I/ Q: g8 Y  U8 b5 u. M- G% N6 t  {
import std.stdio;
! ^4 l# K1 o7 E  }0 Y' D; L& l3 K- `/ \% U
import hunt.database;
: g2 n0 z( r) V1 R  S+ Y0 X$ M1 H# t  i
void main(): w# E, H' f- V& P$ ?
" Z+ m6 y. V1 D
{
3 f, i7 D: w  B; F/ x2 ?3 A
2 x7 z+ l) @" `( M( Q$ a5 u6 nauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 I( o: B) w9 x& g, q
1 h7 N, f# j, d' ~* [0 F
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
1 j! X" N3 R( z5 g! D8 u, Q! j" i: F1 y
8 r& f) z0 @8 w6 y3 \* d- w{
1 A# X; Z8 O" h; K6 d4 }! n( t  F3 T3 ]' ~& G
writeln(row["username"]);
1 T& T  S* B; g* \  R$ S4 c% d, t! v$ L1 s/ h+ v" i; `/ V
}
) ]7 k5 w+ T3 w5 A" z/ X% Q# H
5 |. x: y1 K# D  E4 vdb.close();9 N5 O) q5 a; T1 }' u! M/ `
0 _0 r9 {- M5 X8 q' m
}0 n! T4 o; a6 s9 U
- X+ N, K' [4 D4 l7 |& W8 v
2.2 : Rust 查询数据
+ [+ A4 e& _( ?. W; u
* O! T' }2 I; S+ S& a0 p5 N6 iextern crate postgres;
- w+ `' W4 L- r, O. o: b! u3 U* ?7 r1 v4 [; u' R1 J
use postgres::{Connection, SslMode};
$ @( Q2 g; T9 ^" J2 x
, ]4 K1 I& {1 }2 ^' N) afn main() {. J% E+ {3 ~5 ]4 B

5 F9 L+ m8 O- Q7 Ulet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();2 d4 h, S  [4 g; q" e( a1 n8 d

; y' m! X) K" t+ X4 S" Nfor row in &conn.query("SELECT * FROM user", &[]).unwrap();" N8 g; q+ S) l& I

' d' W$ s1 |" F1 y% Fprintln!("Found person {}", row.get(0));1 F+ _- k( w7 F+ t% Q
$ Z! }7 `3 U0 h6 r+ n7 o$ F# v
}# D$ B- G8 t' P/ t; Z' _' t( P% w
  X( m2 n% t5 R
}& D6 y, Y! B% U) m5 A
) D; u& d. T2 j. c9 ]- q/ e# m
2.3 : Golang 查询数据2 m1 \4 S9 O* d& k! @, c4 z

: F) B6 N$ C4 G1 {9 mimport (- v, F3 P1 |/ k1 E; u

" @) y( x, @  g" T& e1 S& _"database/sql"
  E) A6 _6 W$ p# t( G, e2 s: K0 y4 m: W* ?
"fmt"
, K( k) S1 ?' x" k3 @( r
6 ]# `! s1 \4 P. \_ "github.com/lib/pq"
% B: Y1 n' r& u, q8 E/ H. w$ h% o7 A) L) O
"time"* n, ?: Q* W: ^7 Q5 {0 l  @. ?
- b% h) @3 X' A* K! ^/ o+ w
"log"# R+ ^8 Z9 r# v. [' N

% ?3 M, e9 n- f: @3 A, h+ T)& x) Z4 o+ M8 J1 W9 J
9 Q5 d2 X$ `+ \
type User struct {
9 x1 H" G1 a! \& s4 o
9 j& ~- ?: z! R/ _5 nUserName string( ^8 {- R6 H/ H; }/ x, G

+ ?" \* a& t' `! p- c}  F: Y& Z$ y6 L$ Z( e8 G% H1 a' o) ~
7 ~1 Z, d' g% m- Q
func main() {
6 R  T* L; F* F7 ^: |6 s
: k- }4 H% m" ~; p$ ]+ ~db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 f* f0 N: _; P

! h" \) N1 G( ]" aif err != nil {, j& l! P, Q* i% B) K& x0 i
* b' {1 s0 ]5 W
log.Fatal(err)! u4 Y+ I7 e1 M5 t
3 q7 |0 V+ V+ C  X+ u+ {5 ^
return nil
; o7 Q! A3 F$ o  @% H" ?7 g, v, |% h8 {. B, W( w
}' B$ R# f! T7 `8 u8 a
8 `, W" R4 z4 R9 u+ O, }* l
user := User{}
8 G( s0 a2 x$ \) y; F+ m6 T$ G3 @( t$ v6 |/ z+ C/ e
stmt := db.Query("SELECT * FROM user")! F! F1 m5 o( g4 _

+ o: N% m8 X, f/ |: ]; b. m- sfor rows.Next() {# z# i) a& p1 m4 \$ v

4 P2 j6 P, U. `- ^5 R" B* [rows.Scan(&user.UserName)1 w( g0 H5 V+ v; x) a- ?

  j. q% I5 {( W6 Jfmt.Println(user.UserName)! b/ s# |5 t+ T4 \0 |7 I
4 F0 h. b( J6 ^- R! f( g
}! T% j3 Q8 j* t! _" F
: y3 n/ h! u2 k2 E0 ]
stmt.Close()
" E7 m0 t$ Z3 z( J- S0 i/ K  D+ p5 Y
$ g2 J7 v. {/ L! A; y}# h& C7 p, C# b

7 Q# c) Y/ f* |7 |三、总结5 \4 C2 \' W+ }4 A

/ E2 w9 G' @, a$ j4 t$ G对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。( v9 J$ g6 z  ]
4 `4 B1 t& l  Z, `- }6 J6 m
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)+ G8 K: [" L4 I( ]2 v1 ^" u

! i2 ?% P: t6 A) M0 ~  l在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。# r: f+ x' C" m- i! t% d, e
; |1 |8 Q/ w( ]( ]7 q$ d/ y& b7 p
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
& ]+ {9 \* d4 a& ?5 M9 e& _% n————————————————9 R( ]% F( {+ Y0 B
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 A/ L3 U: C6 W0 }( b% O
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
/ ?3 f  O# z& Q. g7 a* s) w$ ^: p/ h. F' p3 x' g; {9 Y3 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 04:20 , Processed in 0.053235 second(s), 19 queries .

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