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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。0 S1 x0 A! }  |  [( N( h. Y, ^

2 [7 e, b1 t8 G  y6 P7 X& ]一、数据插入 - INSERT3 V" Q8 k. L- Z/ f* V) G9 Z
& C# H1 a/ ]3 p- s0 P# Z
1.1 : DLang 插入数据6 s& ^: {( y& N* D$ I* W; a: S5 L* N8 r
6 }. ~! W; V4 k: T+ g+ }
import std.stdio;+ t& W: W" k8 {% }5 g5 o' |0 @; M

  m+ S  X1 L! ^' wimport hunt.database;
: w, K* R; g: B7 D" Q" m$ }
1 B3 g( N" }* }void main()/ p6 G* G/ q- [$ K- x

# [" o! b6 ]. Y& }+ {( p{
2 `& y- i+ U* r* R* H. V0 G# m3 Q0 k. T- o
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");! L- M" g# _% _5 L5 f* w* P
1 i# J  x8 s- y) k5 g6 s8 [' y5 Z1 w
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
) A- n6 `" ~$ C: A  Q' \0 Q) }
, I9 ?- L4 G9 J: N// 打印插入数量
/ J# x6 L% u# O7 B$ D* \' _! L, F9 Y8 W4 ~8 K, j
writeln(result);& |7 [( y2 L. j

9 j) l- B$ X. G$ ]+ T, kdb.close();! Z0 r0 s6 u6 m: w6 F* o% E
* m7 J8 j% H5 M
}9 j2 I0 l! V$ m9 c2 ?; @/ V9 N
; R. t1 I1 ]! _5 r# y, A+ `. ~3 c1 c
1.2 : Rust 插入数据3 y* g. o" U+ l3 F( Y% b+ T" I) e

' L4 @$ Z) n; X5 w9 w. Gextern crate postgres;9 _5 g6 @, b7 X

! i! Z$ ?; ~/ i' |/ X) cuse postgres::{Connection, SslMode};% N9 U& z- X$ d- t- @2 \( J

" v, a' V* f. C* |* I% @* Ifn main() {
! C4 ~2 j& q6 @& b: v) T: J4 D) ]( L1 ^& m! h6 s  s3 Y/ W8 E2 O
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ D, a0 p+ W& c' w9 s1 o
$ M: M) Q( @5 i( }+ s! k+ R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();9 {: _* b2 Y5 ^1 H

3 B. r$ J5 ^7 F4 T# N/ a- {) Z}" _, t9 B9 h! T& s0 H# W8 y
0 b6 X' ^5 j: ]
1.3 : Golang 插入数据
- }! e0 C8 D7 m
% `6 c* _! p3 ?7 a  i7 timport (
- t3 W7 ]" i  ^+ |3 ~$ E# a7 U( {5 Z3 j
"database/sql". g* \4 r) n) g' ?

) O1 m. Q2 e$ C# B# Q"fmt"
3 W7 c: a( ~4 R* c' [$ x; W, o+ J  a  n2 z
_ "github.com/lib/pq"
! L4 h+ e- s& k1 B: r
6 h( V, l( X. ^. e"time"
) _& T8 j8 ]6 N5 `, g4 s+ t  I9 v" i5 `9 ?1 [( b8 r
"log"
/ h, Z0 K. Q. ^  g# ~8 D5 {7 n, L
1 M8 @9 ~' d0 Z) U3 m8 {)  X7 S" E- M7 X/ N1 H9 Y) y  ~3 {

3 v0 z  C" r' l% k6 Pfunc main() {' X3 a& z- W' Q3 ]3 @4 Y8 `

$ ?  M2 T% X0 z: B; B) B: h  F2 bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 S/ V( ^5 w1 [" A+ O
/ u" p! L+ a& `$ p- l* S* f
if err != nil {
2 d8 F* M0 b7 h
( B) ]8 ~' r4 R/ Z# h3 {log.Fatal(err)0 h- P1 W) M" Q! t# m6 N5 ]& E
( a4 f" F3 W, g/ d* s- ]
return nil
7 S: K0 U/ W: H# U! U- A6 L. J# A' |9 O
}
9 T$ V& s( ?$ K9 I1 t: `' S+ ^' T) s
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
# f6 @# w, h' z. |% P  ^3 n( F
+ U( I% W4 G' B( Z$ `stmt.Exec()* T& c3 L0 E% b3 z* m% N5 U; B
( d/ Z/ ]) }, X/ ^
stmt.Close()& g8 Z& }6 t: k, V# o
( T8 B7 U; Y+ z6 K7 _) A/ F
}
/ Z9 s, U2 ~" [; z' \2 K$ p
9 |" `& ?: P7 n二、数据查询 - SELECT
- x+ y  E1 x/ o# d) R+ H2 W% k5 t* b0 n, Z/ t  X6 r. S) ^
2.1 : DLang 查询数据. U& p! q: [' r& r  y
! |  Z0 k$ T+ ?+ `7 b$ O4 g
import std.stdio;
7 `/ {* \6 P5 B; j# s0 }8 @  J
' I& I2 g' l3 q8 |/ A/ X9 Q* \) K! |import hunt.database;
- W1 V5 l7 D2 f0 y6 k: }4 |' e1 [1 }- [- T8 Q; H% U# T( a7 B/ }  |: n, t- l
void main()
1 A, d: y# a3 M! y4 h5 |8 U( U  X! ^& |5 Y/ p
{$ [: S  I1 |2 D2 |- n
5 F9 X6 A3 I# J) e8 n! n
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
" _/ a: m5 O3 v( M* y
& g. e. n- n  w5 p% _" o' Z3 Zforeach(row; db.query("SELECT * FROM user LIMIT 10"))
8 q( [1 ?+ P9 ~* w% n8 ~# z$ k( r& f8 g- E- m
{, _2 d- w$ \) ]- m; z

0 B" W; s+ q, ^3 d  wwriteln(row["username"]);
+ f5 ^# S! e/ B% R4 v
8 e# |# _" u" u2 h; r}$ ], ], d' O3 Q( k! g' W
" O6 w2 p; v3 Y1 {7 _! _% X3 s* I
db.close();
0 x: p; q+ t2 r, w7 ~7 Z6 R3 |( n5 U
}$ F7 Y( W0 n, _. [% ]

  g/ Y- Q; A8 X; s) L# K2.2 : Rust 查询数据
* I, j* _( N! H( S) S0 i- a* L" Z: j$ |) M5 y  h
extern crate postgres;
. B7 @% z$ F1 F
1 e. @: K* C$ n3 duse postgres::{Connection, SslMode};
& W/ {/ [% Z- ]2 o% {/ c: P8 f9 R# `1 S2 z3 d9 `( `
fn main() {
% k1 m7 ], _5 ?- B. K$ f+ |9 c  q4 W& |' A. y  _' P
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();" H; @/ d2 ?% |- `+ i; m
' |% y# i" g1 A4 m
for row in &conn.query("SELECT * FROM user", &[]).unwrap();  |( p% H* m' e  D" J

: K5 q3 `! L, ~5 A# Z6 uprintln!("Found person {}", row.get(0));
; _0 G1 c: n) e* x/ q6 X; j7 A3 R. s5 n8 d$ c/ D" v/ O* S
}- l7 i! y* S( h0 w1 _% H( H

  i! x5 a( o7 X! ?8 {" G2 |4 U}1 U( a  x1 K- `, K" b3 }. T, f
. ~" Q8 K) b* y' S$ m
2.3 : Golang 查询数据. c" j) L( p/ R  d; S
9 V  t# P% H$ t, s( P7 `4 \) N
import (
( p" V  J+ }1 M" B, ]: R
7 F9 @/ t5 }) j4 Q' L" p5 S( ^"database/sql"* O! e9 a7 G) M- M; `

6 \* c! d& O+ o* m1 Q4 ]# ^+ ~"fmt"  k# ]9 X2 R% A0 ?
( I- Q& X! {/ [5 [& F1 X. l* u+ o
_ "github.com/lib/pq"! ^7 ~% ?2 y; d* G2 O, Q, F) n

0 ~& r& N& l: U8 d9 P1 U* a"time". D$ V) {% x3 i, S0 p+ `
7 k: U9 j% O' Z
"log"
- U) \- T' ?. c# c7 m( [# `
2 v3 a3 W4 k* V# W' I+ Q$ I; t: ~)
- r* p) r& g! X8 ~7 K9 |$ R4 N% T. _
type User struct {* \4 d  w% z4 _  T; y
4 b5 w4 E2 h7 o2 n5 V1 f
UserName string
6 O2 d0 c. e3 h8 l' _# A2 }  g4 T1 A; d$ A) w7 {( E
}7 K; \1 f( G# {$ u3 K7 C
; c0 H! K7 c& ], s: y' g0 }/ {
func main() {4 T( K/ D( b- t2 O' `1 `

* V) {, s* v7 T7 n/ ?1 z* U8 cdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")4 D: _7 z6 D5 j9 a* _$ U* y5 n
1 F6 g' Z$ E- Y- ^
if err != nil {
: H4 R+ B9 L4 j2 e6 L- g+ G* h2 q% R+ i8 |! ^: `
log.Fatal(err)8 `2 Q# \! u2 K* f9 L" g7 i2 i7 T

6 `. T- g4 r; a$ wreturn nil3 j/ P1 S% @4 \/ \
; Y# _9 D4 K% C1 ~1 j
}
3 a! g4 ~, f  Z' F, B# C) d
% Y3 |2 X" J. m5 `$ Q. F; a( D) Muser := User{}* v% h; G- s+ Y
  b. o+ R. ?: M' y& e
stmt := db.Query("SELECT * FROM user")
9 G  L- \  C) |4 j3 k& |, p& o' c3 W; X1 }( x) b' F! W
for rows.Next() {
" s* k2 m* j' ~  V% G( H# ?6 z+ g6 W8 q6 d9 p2 u
rows.Scan(&user.UserName)6 E6 e3 U0 m7 K' n; J- w
$ ^* b3 l/ b* }4 X8 f7 |8 w
fmt.Println(user.UserName)% O4 C8 G8 C1 D' g5 O7 p: `7 M
* R) I3 u! u: \+ F3 u
}
- r$ |. `  C; ^3 K7 y
3 m. S5 m2 L' G2 d& v; ]stmt.Close()
- g# Y7 Q! Y7 w* d3 `% p) N8 A# b5 y
}6 w4 {% ~; ^2 v! W/ h& W
% r" Z. g4 ]) t$ r8 Y( r
三、总结
3 @0 e) D5 |* q0 A0 O- J4 }5 O8 Y) h
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。  E# z/ y  \( D7 L/ W( [0 m

! }/ z8 S2 b* V+ k3 a+ C这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
3 \2 Y# \: H" D& ?6 N9 l. j  k0 m3 N) d$ }
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。6 U$ E2 c7 Y0 Q# B. {; e' M% I

7 }. |/ N# L# R: K3 P! U总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。& v1 R, [# f" H; \1 a
————————————————1 j6 }6 W7 p3 g( z2 l' w$ C
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 m0 l8 H& h% X$ I) B6 @1 \原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
* Q# F! K% w3 f( @# A3 H( E+ x; X" Q9 Z+ b4 n( m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:34 , Processed in 0.141273 second(s), 19 queries .

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