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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
3 E" ?, k% |" \$ E. m) U& Z& Y) `
5 g- I( C7 A+ R2 i一、数据插入 - INSERT
- e. g3 }: @, B0 c  Z& [3 S$ v* U* E# H( x/ r& u5 a2 Q. I+ L2 W/ n
1.1 : DLang 插入数据
# m- D  V! Q* ~7 r0 q6 Y4 G4 |; S! u4 `, g( `
import std.stdio;0 Y; I$ w' D& q% }4 E, U) H- n
6 i# y9 H' ?0 J  v: o
import hunt.database;
. b6 r6 q; k9 v. ^5 E6 h
; g! @' e' n. Q# J6 |' e  m1 f! uvoid main()
& }, |* i+ G, R$ A1 J$ u' e" ~8 d
& h9 O2 u4 J. u, R! l{
8 u/ |6 R! f7 h& U$ n) `1 }, B9 E4 P2 S% X  I% i
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");" y4 T, }2 u8 D

3 s9 U% k1 b$ d- X& A- {int result = db.execute(`INSERT INTO user(username) VALUES("test")`);5 k1 t8 i5 c- c, w1 ]( h- t# Q

) ?  S: i" F( t9 T6 @4 j// 打印插入数量0 C$ g* s: i) [2 k7 s" f; q8 J
5 K. |' \  @8 ]/ V9 X/ |
writeln(result);
2 y$ A; a6 V* k1 p; f0 K5 ~! E6 N$ b$ p% E6 d8 |$ I
db.close();
4 j- R. {3 L& Q! `8 B4 L; Z1 S# t; }5 X# l  t0 M1 `3 P
}
" e# _$ ?- Q6 {, d- b3 M0 }. O% K2 V$ k5 X/ x8 k
1.2 : Rust 插入数据
8 s9 s+ Z; ?0 A4 G
1 {! ?( [1 ?5 b  t0 Rextern crate postgres;
! |$ ^4 d) z. b) W) V  f
( c, k9 f1 {: F: C, l9 v  ]) H/ {+ ]5 Huse postgres::{Connection, SslMode};! r: S( b1 R6 F
6 h6 J( W0 z% L+ ]+ S9 p
fn main() {
2 `  S' K# B- Y/ g* E8 D) C& |2 W% {) J+ J; I/ e" Q' ~* O, ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();8 j) [* ~+ {! q% u" D) T6 t
2 Q% n$ t5 Y; G5 ~
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();: ]! m% J4 ~& k' Z& \! ^
" R6 u  d# m/ d# J; y
}
( x& F% v: a+ I. m% O3 x  l$ q, Q8 |' v7 B, n8 M( F
1.3 : Golang 插入数据  m6 ?, l! Z1 B  l, ?. d3 D# v
4 e& H/ E7 i* r4 U
import (& s, x3 U5 Q6 [/ X% {6 k
8 f& ?$ k& F- s% M9 E
"database/sql"; T7 r& r) }: F
/ [) u' |# M4 R! g
"fmt"
- ^" T0 [9 G% |# p3 W5 _: L! Z) w- U( l6 R8 W2 |0 E/ z
_ "github.com/lib/pq"3 K0 v! N& h# ^. H2 @& u4 j8 n6 u2 N6 m
& N5 j* _3 P5 }! v2 k5 ]' O
"time"
# V$ j: J) \9 `, k2 j% Q) a
5 v- ]% t# e( H"log"; R5 s8 z  B  x% j3 n+ r6 Z  v3 _
4 L& U$ }6 @+ h9 r% i2 c
)8 s3 y, p* _$ L# M! ]% i& b/ z
. \7 y) q- u5 Q) o- [7 k& n, D" J
func main() {; y1 x& |3 H) X

- h$ S! B% U7 t. u! N' ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")! u- {, G" m! ^1 l, H" o! ]

7 H5 Q9 L  Y+ c! P3 gif err != nil {8 C3 V% c/ M9 R' F, k, c
& p6 g% s5 y& N+ H" o
log.Fatal(err)
; [# ]( w1 b# P7 a7 b; F% C# N3 D; o4 I
return nil
. x4 j- K8 {2 y6 }/ P. |* K
1 v: _7 t+ Q5 d}8 U2 K( P* [- {2 c" d5 Z$ O
3 Y& A5 C7 i) X
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
# q" ]. k2 g" e5 c4 C: t' H) W/ L4 [% v; j  ^- k
stmt.Exec(). \5 D! I5 Y0 r- m& t$ v
& S" C' V  \8 u/ q+ A* M& h
stmt.Close()
6 u- w2 f& ~* e% Z) {5 s4 g6 {& |+ m/ P
}& a8 F" I3 N+ E: V: B& |/ j" k
9 A  s$ W, I8 f! e+ e
二、数据查询 - SELECT
/ W' x" W0 B% w! i- t( r7 E  T3 x5 ]% Q) o6 f& F" F: R
2.1 : DLang 查询数据
2 s  y' \* z, m3 Q! j
! P- ?5 _, P- G/ S7 `import std.stdio;
9 }, z: z: w+ I7 @8 b# R8 E/ c/ [! X; i! |/ u
import hunt.database;
* o* _4 s- j& k
' s3 g. w  x9 _$ x5 J4 v; P. K, s/ Nvoid main()
" R* K- _# |; V- r5 d7 a3 T2 o! D$ T: B) y/ i! [; Y) v
{  q0 c2 e0 `, `* D8 e; T4 E2 b

: |* h/ \" m$ T) Bauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");+ ]' w+ f- a- I9 b- ]0 y# J
( m" Q9 K1 I( A4 p% t
foreach(row; db.query("SELECT * FROM user LIMIT 10"))& u9 t- o: c( a) D6 y- p

, G( e7 l# G. p9 e* X* b( T{% O& K- i0 j0 L3 D. {" N6 F

: F/ X$ h! {7 L) x/ [; {writeln(row["username"]);
# L$ _7 L  [" h0 \/ X( v# W8 @9 D; o. v. Y- w
}
. g' O6 b$ F' e" |1 j2 {  p& `9 h) Z8 ?1 d( L7 h6 o, Y9 {
db.close();
6 O/ A- n" I7 |: m2 s7 ]* I- U1 o4 o
3 o9 e7 Z- |7 F- v}
4 W( R7 Q; M- x3 u  g3 g2 K6 `4 O: h, \; w4 c
2.2 : Rust 查询数据) K- g) k* L) v) }& o3 c

4 a! y& ^* z- N1 {- u8 jextern crate postgres;% f/ G: Q4 y# N  t9 [

1 q5 P0 z8 f2 l5 Q! K) p# l5 }use postgres::{Connection, SslMode};
% W' N2 u# _5 u' q' x' j& S% I" j# n8 O
fn main() {  X8 k' ]0 R9 e# I2 M

' ~6 e; X/ X+ M3 m/ }# C) Zlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();" P; U7 J* ~$ F  H9 S

- G  a- t, q) W  j6 D: I: \for row in &conn.query("SELECT * FROM user", &[]).unwrap();3 b: h/ f/ T7 j% N
# N0 F. ^* y) C  m1 d  t
println!("Found person {}", row.get(0));8 ]7 Z8 k; y" k$ b) T
# L& w) y6 f. X
}- w) R3 K  i# C) O9 v8 V
7 ~$ N, G$ f" Y# V2 [
}  y) d& e. h1 B. q7 o$ A$ m8 ~* S
2 t' [, l" {5 n3 f$ |( V" j6 K
2.3 : Golang 查询数据4 |- x" s2 V' M# S

2 v$ c4 r+ X9 @" u2 Gimport (/ b5 e  z% e5 g1 j
6 n3 Q4 T- ?1 g
"database/sql"% d: E7 ?: K. M7 [" d# a9 ?- X5 Q

$ J) u+ m1 b) `5 v"fmt"
1 G5 z9 e) N' M2 ~
4 W* m" C+ C9 f+ X0 B& B3 Q7 V_ "github.com/lib/pq") o/ G, F* R3 l; o- |# l6 {! {$ H

: B# P$ U8 G- u- a* W& @"time"
2 @; j9 b7 f& D3 b; r1 O
8 T; F& u& d/ R. a4 p  @5 W"log"
2 ?# J  [1 h7 n9 @% b4 ]+ D. ^% a: i+ v* N& Y) [. z
)
0 _# A; l, K, \6 c# }1 I3 J4 o7 T* Z9 k* ~1 D2 z
type User struct {) R- y+ u# s. p, m* Z/ l' A
8 G, z- ~& e* l. F8 A% o# P+ j9 Y3 y$ s7 A
UserName string
1 E5 S3 P  T  y6 A8 T- q2 Z5 L* m, e
}0 i2 ?1 H# G$ ?: d
/ L; W1 o1 S4 t: B: {
func main() {
) j& B+ T+ I9 W5 x; |3 a% R  S
, m: k( T, _% X  L7 U# |db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")* k+ k9 @5 l6 O% a' \9 C2 P$ ^7 s
& v  T" J9 B. m, y' a
if err != nil {6 A7 r5 e- z) Y' K( {9 w! r

, R$ r$ ]' R: y7 D0 Klog.Fatal(err)
1 f; D4 H( {& n1 \( V. ^5 ]% U+ }3 O2 X- g2 P! \6 i
return nil
( ?5 @7 z/ d5 g+ g# o6 U8 y- X% Y' E! O- Z" r3 k
}4 d4 a# b# W9 V$ K( |( |
& y% Z1 j* x- ?1 X
user := User{}
& y/ `: Z& a% J. W* t6 F" Y  ^* v* f/ w8 D
stmt := db.Query("SELECT * FROM user")
$ d* o, ~- t- f% L5 {# R) g: O! Y, `3 Y) F# Z9 f3 Q8 h
for rows.Next() {
' P: ^) ~4 n4 p# m6 g. e
; L! {# o! \" Q9 |) x0 }rows.Scan(&user.UserName)) l- N1 S- A* [4 I) V( e

1 M4 {8 _6 l9 G8 Ffmt.Println(user.UserName)
3 r. Y% C. m8 J8 g5 i$ j" [3 w+ f7 B3 e0 l7 G( A
}& ^% c" C0 ~" f8 ]
: o0 s) g4 c" c
stmt.Close()- y# W5 H# s' e$ Q' ^

- w! D6 N, b, X; o' t3 B- z}; [6 }% P* @! q4 R
/ P! B* e5 F+ X9 K2 l
三、总结
- D$ o" U9 q/ h0 d4 F
. g3 T6 @2 V4 F$ H2 t' n" |& r+ p对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。& y/ c/ C6 C0 j" P; a' Z
% H8 z  r  a5 l1 L  p2 P
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)9 H8 d8 Z! j# b/ I! |1 ~

1 ]- F6 Z' T7 d+ k0 B  P& ]0 u" L+ }& t在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
0 M* a8 U) ^8 g0 d( T* M. z4 h! [( g
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
4 U) Q) Y4 r0 \2 G7 Q$ Z————————————————% r1 Q8 ^! S6 g( m; C0 i9 q* M
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. H0 t" a8 {( V# F
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
9 r$ d* `* ~0 {' U9 k
& t! Y( n5 v$ E. ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:39 , Processed in 0.062846 second(s), 20 queries .

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