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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。: C8 Q3 _, f% E5 Q1 q: S6 a
( C0 F! I1 r( Q/ e! U
一、数据插入 - INSERT9 F* {# x0 N" @; \2 `
7 z% H- k" y3 D& f6 P$ k
1.1 : DLang 插入数据
  }+ h- S1 ^6 \7 D7 h' T' K
' A/ e( G8 g& S# d# c0 ]import std.stdio;% w9 s, W* x. X% j, t' u8 C5 s
9 U$ l5 w8 A, u
import hunt.database;
9 V: Z7 \( K2 s+ \: [/ C
6 D5 e3 @, V4 g' Ovoid main()
# G' |* Q% q' u+ x& c8 T
# c8 @! T& j( I" a3 Z  B$ h{
' X3 b1 A' o! X6 v) \0 A% {
4 O. e( e; c# y7 c2 h+ j) S9 j2 Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; c# X. f3 ^8 {6 R3 w* o+ M

; J1 @7 N/ R, e+ Z' dint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
, G. Y8 d* T! x7 U4 x1 O2 Y, o/ ?$ F, S4 B# S; t0 o
// 打印插入数量# e0 @9 J7 [$ `. L9 L$ p

3 g! Z! p/ z' e2 W+ x' mwriteln(result);
8 a3 d9 _: _) \# X& Y- T3 f0 e0 l0 n5 Z, H6 `1 p' ~
db.close();( E5 h5 X& o7 x7 s( ?
- V0 i. m0 z& C+ U7 s
}
, p2 T5 K* A/ N
" s8 v9 A! r3 @; K: @9 `/ Q1.2 : Rust 插入数据
* x! L9 m( L0 n4 J1 Q& E; G5 E% Y( s. F5 N( F0 K/ n1 n" F
extern crate postgres;
6 Q! V& E% a! X' u: G' u4 a' l
& E* b$ E; s8 Q1 h6 l& Euse postgres::{Connection, SslMode};
7 q( y2 I  s) I! q. _3 D/ U
) `; ^$ X. w6 U  G: J' N( Lfn main() {
7 w1 v1 D1 q! F# o7 m7 P0 h# n; Y* g4 c9 g$ x: y: e5 {( v
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
: {. ]( P4 d' }5 G) {# k1 |, U$ y% S8 k6 M, S
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();! _$ C- ~% D- S. r2 Q" V9 H
6 d* l" c/ O: D
}
% w2 a/ }" u, t; t, X6 {* ]$ w/ R3 k$ y
1.3 : Golang 插入数据
: S5 M$ D0 J" }9 t, @0 G7 H, b2 J5 F7 Y; d% ]9 ?
import (
1 ?% a, \( F9 B) T% @- J6 F: Z' M0 U# @$ s' b# ~/ X
"database/sql"3 @* l0 r# R: @9 M% Y+ l
6 w! W% q1 f8 [0 i& t
"fmt"
9 U6 z5 g+ x: A
" e& b: r0 q$ I! ]6 e_ "github.com/lib/pq"' ^8 L( `' |4 m9 m3 ?6 }; [

3 ~7 \+ |- p$ b, y"time"
# T  l) P- F# V# [- P+ t+ P
/ K; t2 _4 J" D' @6 a( ^/ b"log"
' h  [" K' `7 E9 R9 g
2 `; E0 R9 d4 \4 Z2 M)
# l: n6 q& J2 G3 @7 d: v! p; N
2 \1 L: Q) i" Y/ a6 o9 Z2 Zfunc main() {5 g. V' C& E& w

: `; X+ [9 S" E" }- Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( _+ R$ o( G# [! A$ p' _6 G

5 u1 E, a& C- Q8 p- n" Eif err != nil {
# P( P& }( m! v* |2 ^9 v( n. ^2 b* h, o% k! T
log.Fatal(err)
* m( `) I" N  e! o3 W
8 w+ l6 P/ v/ S5 F- Rreturn nil
: l+ [2 d* ]7 U. m9 \+ N
7 G. h0 ]: Y) O2 f) H}  }+ Z6 Q% O- @+ m0 s2 `  g

$ r+ H; {0 j7 f4 A. P( ?( zstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
4 x2 }7 Z6 E% G4 j+ A
* L7 E. O$ _$ M$ M8 fstmt.Exec()  p4 m; ?! S  W3 ^
0 Q* A, ?* J$ K& y0 s8 o
stmt.Close()
6 g' r* A. f9 \
! ]) G* _7 ?/ k; f" p  A}- L  s! P7 `7 ^' E- g

( a5 z7 n) A9 l0 G% e$ ]二、数据查询 - SELECT# L! b2 o4 e2 j0 {* R. ^
' a( @4 w$ ~/ w: l
2.1 : DLang 查询数据6 O- r& L* V# a# ?" c3 B
$ v! W' T" c! m2 R5 l7 w, V
import std.stdio;: ^% ]/ j$ B; l; P8 S3 R! `" W, e

2 j) F) r. s, simport hunt.database;( o0 V7 d% g) w+ L! ]
$ R0 L5 K5 u' N# E; Y) b
void main()
. A( L7 k! E" P. v2 y* z' r) u4 |- \2 {, T" e7 Y: E1 f# V
{$ }' Z+ }# s7 z9 t/ [1 {

( @( u* J* u6 y3 |9 B  D# K+ K* aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
( g- g- R8 M, N$ G$ V! [. j! P, i$ z! j7 ^  ~+ N( ~8 m
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
) O' I% e9 Z9 A: |- H* U
; b& H4 M2 R  o, Y{
2 e7 [2 R% t9 a7 f2 f9 j% y5 ]' D, Q7 {# J% N
writeln(row["username"]);
& _; F. o5 s6 D( f+ d) \5 `" E/ n  ]% G) k, D
}+ j- A! K9 m# D* F3 ?
( i- |$ Z  z( L0 w; j6 l
db.close();3 ^5 z% z0 _# S& C9 I& {$ E& G# q

' x; Q6 c9 `; R9 V/ [3 @}
8 I$ T: F0 e: Y/ w3 x9 H
( D5 S# f. k8 i3 s- F+ |, l2.2 : Rust 查询数据
3 z* T3 Y, N' Z- [, X! ]
% S5 W* L, I6 }. m* aextern crate postgres;' l7 [( l' l" Z1 z
6 }0 U5 H7 G. h& G
use postgres::{Connection, SslMode};  ]- H5 _$ H# i/ h; e
- S5 c9 I/ X2 V: V1 S
fn main() {
: s/ ?) A* _# _! v; k- H* @# D6 W7 t9 }: J
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 C- H/ n  V: ~, @6 t, d2 H% Y3 P0 p0 S# @9 \% ~' N  Q% o
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
) T6 A* S8 F+ s3 g0 Q2 z8 u
" J' J" E8 e; l5 Bprintln!("Found person {}", row.get(0));6 \7 G) X: F( h& d0 D1 \
& t9 T. q- n# E& ^8 p
}& n" I2 E, M( n1 d' i" Z
5 [' N% }( t% j, y* O9 ]( x
}
( n7 F. h0 V! k8 q. {
' H/ U) |* d- F/ d8 q2.3 : Golang 查询数据. [, M: {" H6 s# }  G0 o6 w0 r
. j3 @) ]( L4 x% Y( n# j/ @0 ^2 H
import (( G/ A6 y* V9 `4 Z
0 v* n9 G; |( X
"database/sql"7 h) T( k  u# |* ?$ g

' \2 e' p- G# R7 |: m# x) E"fmt"2 K/ L9 N7 j7 c
! U! F, Z( c9 L. {- H
_ "github.com/lib/pq"8 {" f" H+ \: K
+ b! L, P4 P" J  \% H3 M
"time"
! d6 G6 @& o- t$ l, s% S) h( z* r! h
"log". ~' A4 t; A) f" g5 B

" m0 n/ K; i/ Y* v; a4 t* g" U)) G( [/ l$ {0 K

; M1 B& Q& {; H2 }type User struct {
  F( w8 T9 L; ^+ ~6 f3 i* a2 {0 m" V7 H3 L% N
UserName string0 f! _% ~( V/ N% Z7 K
& ]: B- R) s; k) W
}# Z0 e' [: g7 Q0 V
3 |5 ?- A0 n; C/ c$ x
func main() {
% B) H2 [3 j9 E6 A# Z" z
/ x  Q3 b' Q2 Wdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"). |# U3 ?; t9 H0 @
! _: Y$ S- F  r
if err != nil {5 p8 j" y* D  U; S+ G! W) K
1 _% j! e) Y' ~1 a
log.Fatal(err)8 O2 @& X1 ]# s" D! A$ p) F) {* b
2 o; [" T0 d0 @9 l# q
return nil, R3 Y" d: g0 `7 X  [

  a. t* S0 c- h6 @2 |' t" A, [; v% q9 g}4 t; S+ h6 N. p. }9 g8 v
3 M/ A7 u. [7 c/ A* |
user := User{}' J3 y# I$ G* E1 H1 R$ C
4 P5 C# M/ I2 f0 c
stmt := db.Query("SELECT * FROM user")4 a% O2 ^6 o5 n/ J

% N. l$ D; Z; X) f$ P7 {for rows.Next() {
- B' y+ _5 R& W( L1 [' L
% z3 [& H3 ?) V& I" C3 Grows.Scan(&user.UserName)
0 Q* i0 I, T* h
# x) v1 u3 p+ q& s" C& N9 lfmt.Println(user.UserName)) H% \1 Y0 [+ T* m6 f& I; O
, k/ D" J& b/ X2 J' T# x+ P1 c$ l
}5 W* t/ I0 \- P) p/ K5 z5 @

5 p. b+ M+ }# J" ~4 V0 istmt.Close()
( S; ]" i/ z2 i* O# F) M5 B3 O, d0 z# F% u7 i
}
5 f2 ?' e- W4 r- q) A' b0 J& u4 v/ f3 m; s. f
三、总结/ _/ |5 L: J1 ^( n' n5 Q0 f/ i9 b
9 n# J) J. ?7 @2 @3 U
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。. S& F6 U; b+ o

+ ]* ?% z% g% C' i; I" ?这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* E( k+ j1 J7 I5 ~, |( z7 V2 `% W, h$ C; C% T
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。6 v5 a0 @- Y# Z7 P, H2 w; H
/ n2 e) W( Q) ?( ~
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。- K0 b; D7 Y9 a/ _; Z7 w! d% G
————————————————
" \( ^  {, i6 y: s* F9 C版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! Z. U  d7 w2 Q" r* o# V8 E原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339610 A5 J/ Q% F6 Y- o$ K+ _& s
7 G7 h" F! \6 \& G4 J& [0 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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