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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
& k/ r% {/ w% ?* [( y8 t
; n! Q$ u0 b1 t* a6 S" L: i4 S一、数据插入 - INSERT6 m$ D, N3 h, j0 l1 m" |6 P
' a9 R! Q# j. q  Q
1.1 : DLang 插入数据3 P2 _7 C( i- Z  I( i" ~) E

# C' T' q/ G. I8 `$ U1 ^9 yimport std.stdio;' Y! }5 K2 X% }9 p* W/ v
% s$ Q# S2 W( z! F6 i, ^! F$ n
import hunt.database;
* T* W) K! G' c( z! U1 c! A9 Z$ k1 I$ E8 C
void main()2 |9 h1 O) z& |0 S8 j

) w: T- R( \# H{
. `" s2 T$ }- o% h5 G( P; `' h9 Y5 D: v! G, i" V4 {& I
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
- p+ a9 C3 E% x' x1 m0 ?5 O6 [3 g: f, u( x
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
! C' \4 {! k6 X: X- Q- t& l4 H$ N7 y  c: y$ T0 a) p/ O2 i% B8 b
// 打印插入数量! z3 b( K9 O% N% I) V
0 k" L) D+ ~2 N0 c5 y
writeln(result);2 z- D# H- k; L; w$ R

- Z, V  M$ i1 `db.close();+ F5 s6 p# g8 r9 H
( G2 u6 R# E: K4 S% S
}8 q* g% N2 r5 [7 Z
( X1 }: Q, t9 W! L; i1 R. Y
1.2 : Rust 插入数据; `6 C, Q0 ^  w

1 ]7 W, T2 ~8 }' J8 j' Dextern crate postgres;
+ \: o0 U  G& ?) M
9 q; b; D4 W+ W- u* o6 O) Duse postgres::{Connection, SslMode};
/ r9 {0 r4 X4 G" E+ p, J% ]. T, j5 x9 F/ D7 M8 Q+ l. ^
fn main() {) M) E/ }3 z$ p2 b9 c

& v- s$ a6 \7 x! L5 X5 g! `let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
. @+ m) D/ p1 R3 Y- @: f
6 z- _8 p- Y7 V, tconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
+ r* n; N. z- S% [1 t( ]
5 G- F9 {  k$ Y, C0 N! [4 G7 W}
0 k! ]/ e  N; t: v- V  a$ P5 V# D( j& i! w" @( D; P% I, d
1.3 : Golang 插入数据2 P8 x* t* u1 @, w
8 X( U# Y7 L6 T1 \+ j
import (
# [$ Y* e; f0 }, G
$ T2 z  T0 I' {- Y0 i"database/sql"
$ e3 d1 i& H+ n9 ?% s
( C$ Q  `7 X: e" y"fmt"
; }. S" q. g4 z- Q9 [4 q  h1 P3 e: _* F1 G
_ "github.com/lib/pq"
7 P* s7 D8 q" e  m1 l1 T
- z9 ?. }+ k7 P, Z"time"
, M% n# e+ y7 q6 V( J, s: Q% R' ^4 S) m' x. w$ Z2 D
"log"1 E* Z0 Q0 a! H/ z( o6 ^7 o! x

/ B3 l+ X8 u+ G, E' M* ]); \4 z( \0 ^- l9 k( M0 C

7 `" b' z7 ^1 `- C6 E4 [. z" a9 `func main() {1 v# E0 ?0 e% Z) W% q4 Y
+ \9 @& T: U# c  K/ C# B
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
2 |/ V7 I0 G. t' t$ e' k5 G1 p$ k' p
! F: t  c5 R- {. ^* Bif err != nil {
# _5 D! Y1 _  ~# [) S0 q- S( o1 D' W$ z
log.Fatal(err)
( \9 R; x5 m1 x# R- O; d- y/ @
. K7 u, L: Z/ a) a' Ureturn nil
( r4 p5 v& K# y' _( L* q
8 o0 ^! @! T3 W}
! h  J3 \. n$ U( g3 I9 V6 Q+ E4 Q1 |: A. n2 I/ p! R, L* Q3 h
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
" i5 y: j1 S, m- n# `
; ?9 z/ Q$ q9 d7 y9 T( ?stmt.Exec(): n# N/ C+ f2 c2 c/ _
' E5 J7 E0 \- M- r+ d
stmt.Close()* m' U4 i9 y- k6 t
* Q4 q) i4 x+ C" k
}
8 \) y' m7 |6 q4 v: K4 c8 C
7 a0 h/ l& H& S$ B% P7 r  a二、数据查询 - SELECT2 E' q7 r5 S  q. x5 @5 v+ v

) {% R3 Y' v% Q; t; g# T6 `7 l2.1 : DLang 查询数据
7 ?+ J: @' B4 s5 x- n- ], @4 k  ]( z* @" X( B  R% `; u
import std.stdio;
' k+ o: B! x1 b; _& O' f7 N1 T1 @1 Q9 `! N4 ?
import hunt.database;* \. W; Z$ I" A5 |2 U3 L7 W" J

0 g$ a! a9 o: G: h; q& ?: Zvoid main()+ ]' `" @1 m+ T4 F2 Y0 m0 j
/ q1 Q2 f# V7 \6 V
{
/ Z& X; q$ U" ^7 ]9 @2 e) Q' V3 M- b1 l8 R* C
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
. z+ ~" @) f6 b+ e% f" q. r' [$ ?1 J) e; a" p
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
3 c* B9 f' r! V) `9 z& m
# Q9 m6 l  I2 ]  |+ l) H+ h3 L{; }7 Z' [- C  F4 c, Y

' M8 v( D* z7 rwriteln(row["username"]);
- y+ F2 i9 i) y) M. v  [
+ r  H4 i7 ?& n5 S}0 M: r4 d" G! Y% F
) g) g6 F$ v- W2 |! {" d1 g
db.close();
' v, l' e' d" Y8 V+ h( m  C5 V6 L' F  L& F( b! H
}
+ u' f" S. c4 B: G* e/ N3 z, _6 |! b( x
3 ]- l7 `8 Q3 }- U( F2.2 : Rust 查询数据
/ Q3 `; c5 U) I  p! t
: L% l/ Q; i: g; l8 vextern crate postgres;" I1 }7 L3 ~- R" r  ?- q, I
9 B: X# |& {; }1 M- y
use postgres::{Connection, SslMode};* ?. y0 p, V5 }. U( A' b2 n( v

. w- d0 e, J. Q! Z1 h9 \/ G0 Yfn main() {9 e: o. e! L5 T+ a# P
* w6 e7 @+ a1 S1 x8 W6 ^0 J( n
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
# M1 x, [: u1 `& S  s3 k
3 ?1 L! a9 n) |0 s  N: Nfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
& P* S5 a% I  ]& g% s- y( D- \/ t8 |) ^+ ^
println!("Found person {}", row.get(0));/ X* i0 G1 }9 [- r. M4 p3 J
. a/ x1 {/ c! ~$ ^5 j% u6 Z
}4 N* U8 X6 \! V. `2 y- U

/ C+ [  }5 u1 U: C% s; S1 p}
9 S. W3 r4 |$ s9 u8 L* o) _
: {. q9 w4 ]; O8 w/ C% x& s7 O2.3 : Golang 查询数据+ H  G; [: Q3 ^

: t7 }& _& N+ Eimport (
7 ]5 _: `: ^( k$ L
' v! z7 G) A. s8 `+ q"database/sql"2 [! |! x. M4 j8 j

4 T4 y- U2 o; D; E4 Z* n, ]" t"fmt"
6 S, ]) }' Z( y9 X* L9 A) E( Y/ [& D  D' Z" Z! t
_ "github.com/lib/pq"7 v6 n: G8 T3 f' Y% O+ X

' b5 G; A& {5 {8 U& P( v; l+ W; X% ["time"
( P" F0 k' {' N1 }% j6 w
5 F; J) D7 y6 X7 U; W5 C6 L: B"log"
" R* O* @( d- B1 [1 g$ \9 B- N
, @  |) D1 P( W# J* l% L)  u: q+ x# w2 L: x3 y

- N: R- Q6 F1 A6 z! Ttype User struct {+ u: x! x* W2 ^" |7 p9 y# ^6 a0 B
' Z* K7 l( X: \8 D0 ~( k
UserName string- _0 q3 K* `9 d5 w

9 I& T$ ~9 `; o}, N/ F! x, A; z$ u$ k. L) j1 E5 D

$ \0 B1 T! o. g! \7 }6 m- `; K& C* r0 afunc main() {
& U. V, f! T) O/ a
" T/ r% w2 Y- G3 i; N- a- Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")8 j  Q' ^& \6 W, v/ q8 f* f; W1 ~

: D5 d9 V' X' s7 z% v& `if err != nil {
& T7 m! E4 {% h1 ]! u% j
- v( A+ V8 K( {' dlog.Fatal(err)
, P) _6 |+ B8 Y( ^5 k3 K3 t9 [& i% H$ a, Y" g& B9 _- d9 E8 a
return nil
- b" x4 n1 Z$ R9 Q! G" k
* k( w; B0 J* R/ A' }0 R}. j' L. W) _0 Z) }! G9 E7 y
) H* V. H5 d$ u: Q0 z: @; c
user := User{}
4 w& S4 R8 g9 j, b
* y% I& @# e5 j& @6 C  Y0 Y8 rstmt := db.Query("SELECT * FROM user")1 d% b6 C! i" G! }  q
0 N: Z9 z0 E: c# r6 u' Z2 m
for rows.Next() {
: M/ b4 y# e# q5 \1 Z' W1 x
6 Z9 }* v1 b, [$ W4 J" jrows.Scan(&user.UserName): g0 |; P8 z; Z7 }& x2 z
$ J* h7 n9 K5 ]' Z/ z* r3 {" J
fmt.Println(user.UserName)
3 q1 }' T6 L6 J, Z7 Q# X) {% h" G+ R( G+ R3 f* o: [
}
" g0 I- Q; M. W' f2 s
& }7 p# o; v7 i1 N) Xstmt.Close()
9 M+ `& F2 |. E* y/ x- X0 c
; E( T+ ], J' ~7 g( X4 Z1 X& ~' ]}5 s+ H& T7 |! J* I( m5 B, V3 g. \

& W, q: {5 W9 @- E/ j2 e三、总结
5 ]" c) t# v  m1 X. F* y7 O- P4 U* C9 S/ U' K  |" z4 y
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。3 Z" }$ L; x$ G# [0 L0 ]6 n2 e
2 J& N  x7 y. T* \2 I
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)$ ]) C+ \; W/ B% D6 N! w1 x
$ n$ Q, P6 X- L( w& e& T
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。  p, x1 n7 G8 `

3 s  b5 Q0 T+ a总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。7 V7 V7 z* Q& R) m7 ^% p
————————————————
2 `: v5 i! c2 m4 k4 x$ s1 ~版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! w+ A. d4 S; H& M9 k
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961/ Q8 ]1 k. Y' ~9 f+ D" {
# h- M; B& o0 j* G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 05:05 , Processed in 0.130639 second(s), 20 queries .

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