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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
$ c, S1 D) H" n* R- c( Q- ^5 w
) C) R- c* B+ h& u* O- }一、数据插入 - INSERT3 P1 n- ?/ z5 _$ I9 R5 \9 ?

7 D5 d5 X$ r$ ?0 @9 M4 O& u2 Z; Q1.1 : DLang 插入数据! J2 R% B0 |, l4 Q
3 O0 D' i* ]1 f9 M
import std.stdio;
5 a  c. m( s" h# |! f
: B! v* e! O& ^0 F0 x# vimport hunt.database;
& D- E+ @( f: Y7 @' }4 y
6 P: h6 \- d5 n5 j9 Lvoid main()9 Q' O  c6 W% T6 r3 n
; Z* A3 X: s& i& M: m# N
{0 T  h% r0 F1 @. W
$ e8 {- j0 M# k$ l( ^$ i2 y5 @
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
( w% K7 R* d: o7 s- G- N7 j3 C6 u* U* ~
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
. G) f1 @* Z+ U6 C9 P; c" z0 @# b# |; N3 X. \, W
// 打印插入数量7 k7 @- g8 L3 y6 R* I

! P2 Q6 \& ~- L- q9 kwriteln(result);
( J' X* }2 _: y6 x' M' S
7 E3 q9 U. M" _+ Xdb.close();! H8 I+ }+ {/ F- _) P% N# a8 ]
+ L  v! x" z+ ]
}
( F6 @! p% i" ~
: b' g6 }/ k! g/ a2 B/ b4 ]1.2 : Rust 插入数据
$ u% h, @& R# I0 o$ q8 {
- M0 y4 P9 h* D$ X. a% pextern crate postgres;
# I2 t: e6 M  T- R( R, l* @+ g+ ?
7 K6 P+ q2 P: _1 Luse postgres::{Connection, SslMode};
" L0 d& t. V+ R' g3 _/ j* D& _4 d1 a& N1 t  {
fn main() {
2 L$ `7 ]9 E$ s) s% `5 J0 ~  r% U: g, ]
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ `$ }- V) X$ y2 A- j$ p) {
& e: D, p+ N" [, u: {8 Q. t( b/ Cconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
4 O, i1 p& r; l1 _% g. t6 r8 f
! S0 ^  M5 |4 j3 j& H% R0 _}
3 x" i* I0 s, |' x; p% Q- e5 v: t" l! ]9 B5 e
1.3 : Golang 插入数据! ?( B2 H( l3 P# H

0 c* U1 l; n' Q* q, f  k# _0 |import (
/ S* q5 @$ M7 s5 J* |
. j  }7 J* W5 M0 i! o. p"database/sql"
$ p3 J, V" X3 \) ?. `3 H8 D6 F" l2 O& C# ]) i
"fmt"8 Q8 e8 w+ v2 Z# g' \1 S
1 A: L  J. A7 ^) j6 W$ D
_ "github.com/lib/pq"4 i: i5 |! V9 W- J; X
* P" |" |3 _1 K* w& M0 _$ ]# ?2 P7 q
"time"
2 f+ e- O% S) A7 x0 H! `/ }; p# U( G: _5 P
"log"
0 O8 S5 X+ X' V  D$ |6 Q
( g8 ~  j! {4 y# Y); F; N! r3 e- r! U. V9 s

9 {" a+ T* R3 N' j9 B. k$ Z. n4 k! ufunc main() {
! l& v4 e4 x, e0 ^1 Y+ i- ?( C4 A. y. {$ [) A
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")0 Y! p5 H) M. s$ U- y4 c
7 }  d1 Y/ r& I) o5 o% S+ q* f
if err != nil {
% t* `. h; ~4 E$ u8 ?1 Q" z# W2 u6 \3 D
log.Fatal(err)
# I0 D1 N% C- c3 ^; b$ T
) C) F0 L& g. q  I: Lreturn nil
6 @. r. c: K5 P) ?$ z, X! Q: v% q  v5 x+ I+ g
}
7 F7 I, @. U8 z3 O2 L3 ^/ B7 g
& V* j/ ?$ u) k/ W0 _* F2 P& z, Dstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
  n+ L' A* Q! j; y) ?0 ^- Y1 x  D" w  d9 G+ q$ v* d7 T
stmt.Exec()$ C: I7 X( q6 X6 |* r7 b# D
1 b* T9 L/ n; b( ]! |$ o* X
stmt.Close()+ h  ?$ W! c. M, w% S4 J
, j3 Q0 s$ h# m1 N2 o
}) q1 C" ^! U$ I- h5 g& g. y% p0 L

1 c3 c1 r# t1 D5 g二、数据查询 - SELECT
0 T0 @/ r$ G' H! e8 z1 I* L0 ]& y+ X0 k: _
2.1 : DLang 查询数据2 U% _& o/ E# m/ B! K3 R; E% R1 U

! Z/ S* v! d" S+ w* ^9 I! pimport std.stdio;
1 z( [. g0 K" Z) i& V- ?! i( t4 h5 _9 E$ K
import hunt.database;. t0 ?% A' Z/ L
" z( g2 T. Z6 |
void main()1 J) S& F& C. Z4 \

$ j' E& \9 M; X; x, Y: A- @. Y& m{
/ G+ s9 @2 i+ ?6 p- b+ n% J' u/ t  i' k: m
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ c+ c0 t# T- q& v  `7 Z( @
9 u+ Z/ X0 t  h( b1 f
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
$ E4 U0 S# o( U: f8 p3 V  q* g0 B* C" \& K: v
{0 A6 N* W, i7 J# O+ I
6 A! N+ G, ~6 h: k9 e
writeln(row["username"]);- q2 B6 |. b! P- M
9 j7 i/ e9 t& y6 k) ^- m
}
2 G" q6 Q5 v4 H. `1 X. R+ ^* d9 \0 g8 d! w4 p0 q; g+ l
db.close();
5 j1 Q, t4 U$ @! ~' ], U2 L: ~; s( K' _2 ]: F* w3 U
}6 [( h1 o% c4 E
, [* c3 r9 O" C& Z0 @$ Z: `
2.2 : Rust 查询数据; k6 Y5 G% j/ w. F" C; F* O
% b6 z* u7 g6 m5 D5 q, ?% ]
extern crate postgres;
6 l8 H* S0 C, G% k/ ~/ H  F5 l9 q
use postgres::{Connection, SslMode};
$ {/ g% w" I3 f; Y% Q7 n
/ x; x2 }9 k* I, z0 @( y9 ?- k+ Kfn main() {/ C2 ]% i6 u( q- P

1 T# B5 Z7 I4 n6 P1 ]& b2 Klet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% d, y  `8 d: R% p0 r$ @

3 n2 b( U' n8 Qfor row in &conn.query("SELECT * FROM user", &[]).unwrap();" A  j) Z# @, Q, B# Z
6 J0 o' L9 p1 M; \) L' \  C( x$ h% O
println!("Found person {}", row.get(0));
& i6 K+ }' [; v  L/ r/ j7 f+ f$ L) V4 Q$ ?
}5 c) s# [' G+ q  y
# j- v( M; ^/ Q8 w( a  C6 V* _1 B3 l
}
/ b" Y, M) L- o. X  Z/ C/ N) e6 ^6 n; b/ d/ j) R" ]( J
2.3 : Golang 查询数据
7 y' _( u+ e# Z$ P) y! u# V3 J- v  u# M1 `" a
import (
6 O! \: X" p! l) C0 K. g( G
; M- \  Y% L  k6 u) d. `6 p"database/sql"
2 i3 H1 Q1 C4 J& v* {( _
/ w9 ?4 q9 _! ^9 ~) L"fmt"+ t1 o" k/ r  o

, H% U( n# F2 `# J5 u_ "github.com/lib/pq"
! W2 V* j6 m8 z1 l4 I, [4 O  r& q/ _7 ~2 K" A" r
"time"
  i- g! G8 r8 ?& f1 d( a  [. V
, |9 d% L/ m1 _! L. ?"log"0 `7 h; r0 v5 S! V$ y# q# K

- ?: G6 s! {7 X: g, k! I  b)
+ e  K( a4 b0 ^' {. f' a0 f
1 s* X( A; d7 ?$ g/ u1 w4 H  Stype User struct {% }& ]' X8 ]8 ?5 F8 N
2 L  ~6 o9 }' W) I5 u
UserName string% p5 l( h8 x' z* J& A( k0 ?
# s" O3 ^$ ^. F5 p8 D# h; D! \
}
, `3 g* H6 r9 H+ J1 p3 J! N! n+ n/ l* V! G
func main() {
* {' S3 Q! W' a/ t" [: }) n+ ^8 @/ p$ x/ r
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! x' t: M  E5 D! Y5 h8 q8 j. r3 J+ s7 j: ]! I3 [/ c3 k9 j0 L
if err != nil {8 P9 Z( F$ @. A0 w

2 T, G, \+ k8 Q: Blog.Fatal(err)4 K- ]; h8 i% J

3 S! y& R. L: b2 p  dreturn nil
4 C) s& l7 P) g* i" k1 ]8 A+ z* A# l6 ~$ t- h8 i8 g* Q8 V
}7 P9 f5 d5 ]" v
  z! s; X- J8 w: m
user := User{}; Q0 Y; g; j, ?3 |' o" l$ V
3 _' b" K7 T3 r* G, s- j
stmt := db.Query("SELECT * FROM user")* b& b( w, y) q: F1 l( K: A6 q

0 c# i+ m7 D8 I; E1 h8 bfor rows.Next() {( L; U; W2 C6 i4 k8 j2 p) K
4 H* F7 e, n$ F' m
rows.Scan(&user.UserName)
+ i9 v& o3 q- r, x
/ h; J$ t. Z# j; H. l! Z8 mfmt.Println(user.UserName)
# z- J  o9 o0 e/ ]5 K5 Z6 S3 s" Q
}9 w; |2 f5 ~. L* j

& p' Z0 Q$ m# X- P& ]stmt.Close()
* Z  r6 x) z% A7 E. z8 \3 ]. [3 }) O' |; i5 W
}
  B) j8 q7 }- Q2 o& C% c& A' M: P5 g5 |% P6 O: w8 t% q/ O) N& r
三、总结+ t3 u/ v, @, M

7 x! J% ]* F% U+ M& f对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。% c$ w- U. k1 `7 _
4 ]$ x, v6 O9 e! M2 }
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)0 @" V8 Q; p, R' N
+ S% ^; J: `* u) n9 Z4 Z
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。- U; O( M2 A/ H' T4 K

# j4 J' R4 J) t总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
0 a3 p2 _0 E/ m————————————————; Q1 ?  ?; K1 O4 X
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ \' E4 a3 L3 M: n原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
, {, F3 o4 X# e/ P$ q. y
; @, h7 K/ L8 B$ f& I: W- z3 {# _' j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 15:19 , Processed in 0.056828 second(s), 19 queries .

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