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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
; n$ G( M% \6 s- s0 o5 q
0 S/ r1 r! [6 J- |. I  i! _% q一、数据插入 - INSERT
: f; u" n8 z3 Y6 k4 D! w  K& m  b4 c
6 m+ \! E# [; x+ D1.1 : DLang 插入数据% g' B/ i+ V9 s* z6 h

/ k1 g; i* z- A, i& Gimport std.stdio;; G$ z3 [" B# C, U" A3 `

1 X7 {1 D! I6 j  o6 |4 Y1 |. zimport hunt.database;1 g5 d" T3 C0 J$ L, o4 Z
$ x+ ~/ S9 o' o- [9 h2 w1 b
void main()  h& J3 B1 E3 R1 _* e. P7 c
: g8 I. A: ]' m
{0 F* ^9 U( X& ^  @- {* Y/ C6 M
" _' o' b/ z/ q- Q1 ]9 ]
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
' ~0 w" \% Y$ R. f
( O- e& k2 A/ |& F' xint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
; v* r* k+ B8 m1 I
$ H5 ~+ m  ~9 V2 j// 打印插入数量: b( K  {7 ]: G9 U6 P1 F* `1 O" @( g

- I" u1 J7 v4 l$ l7 K' `writeln(result);; v) N7 N, ]; X& [) P/ b- U+ R* A  O

5 X; {6 j, ~/ c& ]& f6 K, i6 Ndb.close();/ X4 a9 y8 l$ }2 l4 g; s
& X) Q. x, A2 m) x* p0 V: O
}% c# W' y- r( ]) a; d
* u" u& V' z! n: v
1.2 : Rust 插入数据
3 F% A% `, F. g; ^5 `4 e3 c# U1 I( d) w2 w, {" @
extern crate postgres;/ a- y% ~; V: G/ X0 z$ R% m
( ]2 \0 a6 |0 J; b
use postgres::{Connection, SslMode};
5 ]/ Z, N8 B- l
" Y9 B( E* q: v6 O5 _+ R( V& ofn main() {
) Z$ L0 c) a$ }, d( u3 F7 D; L# ~! l3 Y
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ G# ^. _5 l9 q: s& L& _2 Q7 a* @2 C
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();& F1 Q5 {" T+ t

( \% d) ~4 I) P# w}. Y; R- N& G3 \$ m

4 q! ~* j% G/ Y" h: w1.3 : Golang 插入数据
" [1 }+ I! R6 Y! G+ N- g" N  O$ Q' W# R9 w6 c2 S. M
import (: p) `/ I+ r  r% F4 P( L* I' U, D

( H- P% ~0 {8 W9 D3 w8 e( e% @"database/sql"  D( u2 T- \; K- r8 \

/ t! k1 @& C/ Z. h2 x# {"fmt"
7 b9 P- f! r' x# ]' [& _  U$ R# _  w0 Y+ B
_ "github.com/lib/pq"
5 B" y4 @2 m! t
5 `" z5 D1 U9 p/ V! q0 T  R: G"time"6 D/ J6 e: j  t- C; _# o
) u6 q$ ^. x2 J" D* |5 K
"log"
& g2 p$ t* U, Q( s8 T
$ L' i$ d& g1 b/ {7 k( h* J)
3 g9 G! Y8 H, U/ q
& L0 Q9 B+ q; [func main() {
# e/ Y; f* t( P# {. ~. X( @5 D  f! ~4 ^
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' [/ {7 U4 e& K1 }2 K7 q/ R6 C$ @9 `
' I5 l5 b  E( O" C" m5 J3 r3 H) U
if err != nil {: z6 A& {8 i/ V  i6 Q- T1 M+ U4 M  [

* e# A2 ~$ M  G. C1 Z8 S/ xlog.Fatal(err): g$ M3 ^3 Z3 Z( N7 }9 v
1 R' R  a; \$ a  O6 b( y' H& {
return nil) k6 t& b: _! q, Q7 M; ]4 w

- o- R. N+ G4 T}# y4 ?5 h/ j/ g8 O5 l) p

- Z: S" v- Q) D3 S8 }  W0 Zstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
/ }9 U1 t9 z) `; _# F( ]' k, u) c0 e9 [/ k
stmt.Exec()6 o- K1 F8 q" \4 f& J! q

% C4 y# o3 X' o) U+ j7 p# ustmt.Close()
" a, P! _& y: Q- q6 _3 N4 ]9 u$ g8 B8 u7 E5 U' s# `
}  N! _+ {# X# o7 ^5 K

' c! G3 L6 g2 ]  T  n  K9 w二、数据查询 - SELECT7 M3 @( D6 X  a, r8 V' `  U
' h/ K; e2 {6 }# w; D
2.1 : DLang 查询数据
' W; x/ {7 f$ S" D2 C0 l# j
6 L: J' {* @$ l7 G+ w. Bimport std.stdio;/ G8 Y3 G: Y& d/ w# O2 G) Q

( G* e" M* X; M0 G9 oimport hunt.database;
3 w7 Z2 b5 C9 u8 ]& r: x1 a( ]- \: f0 Z+ P: B& `2 O
void main()9 i  w, \) T) K9 ]! o8 Q

" i, v, k0 ^- a{  Z8 }8 Y7 U3 k
$ K* h0 N" O* ^! Q& _
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ [3 a7 O8 I1 o4 L- P3 k
8 @7 w' q2 S2 }9 [
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
! ~, Q' c% t, `, S
9 O( H0 E# p, G( }{$ ]. X+ m; {0 R- k" I) S' i

6 l& f. z4 D: O$ fwriteln(row["username"]);# W7 ^2 O, \, B; i% Y% s; O; I

) Y/ G4 ~! D/ u: f$ V- ~! j* }' g! J}3 q: @; a) }8 k( ]6 H' c

( |+ J. M! C+ xdb.close();
  C& W2 y( r. u# e6 B
5 N, I1 R, f' b' M7 p5 L2 u}
0 d/ a% N( `. z0 W) p! v+ z
- U$ m. Y1 j7 [3 L" R2.2 : Rust 查询数据* Y: M8 u) j3 |4 @. h

, W( Y) y& ]( y: E% fextern crate postgres;
9 c5 o. U) `1 K
8 ]! J/ I* B! P# t' Euse postgres::{Connection, SslMode};
) n2 p+ M: d* B" e! Z, ^1 Y8 i6 r4 g& J
. `7 z1 v2 ^+ b, N9 ]fn main() {
3 {0 f4 ^. b: H1 c
& W4 E0 G! Y, elet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();0 b" f; F/ e9 r7 A. h8 z% v
" W2 o5 g  Y5 V+ v
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( ?! I* q" W. U3 y: R& U/ i; V, W% D2 m, j4 R4 {8 C
println!("Found person {}", row.get(0));3 ]* f4 {. \4 n4 E! L
8 a; }1 Q5 J+ N$ ?! n
}8 S/ X% a+ d7 e% _* v

, X* C9 A& ~; U3 H% f( ]9 o}
, z5 V* @# J* }/ @3 G8 y3 t5 d5 x$ w+ D
2.3 : Golang 查询数据% h+ N& b# o: U  u3 y1 l
5 d: ?8 F6 w, G7 K
import (
9 J$ ~2 Z: t+ x- q" i4 ~% Y8 T1 [( E0 n9 R# Q  |
"database/sql"
- m) {. p) G; A2 M  E  |8 @
* }: `0 a) V! \9 M( L"fmt"
5 M3 y9 O/ h/ |$ w& d5 x6 K- B
7 K! w6 Z+ ~/ e0 C+ Z_ "github.com/lib/pq"6 A# t! w" b* ]( f9 F

( v8 p7 K+ j  M2 O" o$ B, T"time"$ d# W: V7 K8 Q0 K$ ^9 _; H

$ B: s# @/ M7 g: L; h8 J0 r2 z" k2 k"log"' d/ H# _5 e- m, ]

* U3 A0 }) b1 j0 }% o)! ^# t  @1 L( B- R' G5 d
* d9 o3 k1 R2 m
type User struct {
( H& A: @! G6 @! [4 O! F9 N" S+ ?$ U+ B; F( y+ X8 d
UserName string
5 q% v2 u. d2 u! s: q8 k" s8 k- h) |2 F6 _6 O
}+ t9 b- P) n+ l, a& h2 ?

4 L" R: I+ J9 ?1 a/ t& Lfunc main() {! \# |; n) e# U3 s
5 b. v) G& y  O' V2 k, c- a5 O- ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
( ?3 f  n/ N4 e6 I- Z
" j3 [3 S1 m6 v. Y/ x; b: t" Tif err != nil {
) J; w- n( P, w3 q7 W8 M# c9 B! |& I9 @) ?2 \
log.Fatal(err)" h' S% @# F2 b9 s9 u

0 e" O" d% d2 x. b0 f1 f/ c* ereturn nil
( }9 C% C8 s% b  b4 X( @+ c% @, ^6 p' Q
}8 `- O% N  I3 b+ f7 P
: J/ y; G. N4 E1 x. W/ y" C
user := User{}+ _+ {3 u; ?- h% s$ |7 o+ }
" k- e. ~9 l' _1 u# q
stmt := db.Query("SELECT * FROM user")
( R3 j. j" p: y; y) E( e# T9 v) e6 `8 N. _* `! R
for rows.Next() {: |, c' _1 q8 ~& K/ A# p0 Z5 Z! d

( T' l& g# g& O3 t" L' h5 v" S9 [rows.Scan(&user.UserName)
% T- d" Z; K1 t3 w9 f! X) y2 k& d, F) c+ C
fmt.Println(user.UserName)
4 i" y! [# C* u# b0 x
+ |' ^% t. z, s5 ~0 U* S9 o}
1 f; V$ R4 d  `( E. @5 y" L' Y' z8 ?
stmt.Close()
1 c3 W9 h# m1 a/ R4 D2 [; N
. n" B9 q" d9 C2 k}( m+ N- x/ Y( |4 v/ j; ?2 r
4 _# @( i2 _7 Q& ]
三、总结
# L+ B9 X1 _7 L: E6 r9 K$ `
! ]2 X3 w6 b* A对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
* }4 ^6 R5 e. H! e; }! C
2 h9 b% O/ [( [1 Q这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
) h( d! Z6 r) d( b) ?. W0 Y- w$ r3 w8 `, h- B1 ^, r. L
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
2 z/ V+ L/ V" j4 K# @- r; H1 o6 J' M
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) H9 e7 y  h6 B5 ^& J' c8 h/ m  B- ]7 V————————————————7 k; ]; k: i, r6 f
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: v/ i* g3 u  r% `+ ]原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
+ ^& ]6 ?; s* j! V  z& q. X/ c% a; C" C  h) j4 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-2-5 18:46 , Processed in 0.129603 second(s), 21 queries .

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