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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
, `/ Y0 w9 F% \. {( n( d9 X9 @$ w$ Z$ B
4 a3 D8 e: D6 |' k4 O% g+ `& J一、数据插入 - INSERT
' I. ^/ C+ i1 u5 W" d7 A, A( G" y& r- X' I0 K' [7 J5 E3 |
1.1 : DLang 插入数据6 r7 T9 I$ V. J1 G; ~

- M6 l' P4 X2 Aimport std.stdio;
4 ?' M! l% g* o( S
5 W, o4 h; h3 @1 o5 ?import hunt.database;
. l# }* }  W0 U/ C& Q9 I
; E  d! K8 I4 k" N2 R+ wvoid main()7 p5 v2 j' E& E% w+ G

3 \+ R& W* p) o. W{4 d- E0 d  o) G* U
" w, W) o* @  [: _' [( r$ b
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
% q. v: z5 n5 e; n& n. ]/ y  _+ ]2 M- t) d1 O$ C
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
9 F: h2 X; `) l2 P% V9 ?7 N. P7 R1 z' ?, k" Z
// 打印插入数量* g( b$ t5 U, ?0 G3 S% `

2 ^. k6 y; H- c( iwriteln(result);' {* m2 T8 Q( j, l1 L
6 B+ T# U3 `5 s; r2 |
db.close();1 I! _$ S3 k, p; k0 V* r

- n  h5 g7 O) r' w- f$ ]; Y% e}# H7 p% \* Q- `: s' A8 v6 X' w
; S) c* ]0 @" y( I( X! @& N( r9 U) T. n
1.2 : Rust 插入数据
4 U# }7 F$ B& c1 }9 A
& c, F3 P" L0 t! M' }extern crate postgres;! i, M+ f8 x* P6 K& p4 ?
3 U" Z9 }+ i* E; S: A5 f- I3 o% V
use postgres::{Connection, SslMode};
0 c0 a: B9 s/ [9 F0 {8 ^/ S
( T0 ]- _: J8 {" Y+ T+ y; I: j, Ifn main() {. A) }) {' s& m7 I3 d

5 C7 ^; k' k! m# [  y, Q9 [let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 Z1 z9 q  e3 g6 Q, z" ]) B5 @/ G+ F. J/ u) N
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();! \1 P8 U. G" T9 T6 J; `1 ~; `4 ?

- W6 U, A& p5 O& h- q! D+ [}
8 H4 g1 V0 N- d
2 ~) s- B- D8 u2 F5 s& y1.3 : Golang 插入数据) |* j, J  S( v0 W! _

. a/ z6 O9 _) a- \import (9 C; w$ ~* e9 X# q, n" n

" w/ A0 B: h# E% r1 a5 X8 h' \"database/sql"
) ~. r0 [0 B0 X# \( H0 S! F& Y
# A5 f3 Q3 O3 }' H"fmt"- x, X7 @6 x  T5 l/ C) X

! T" }6 |* d# ~_ "github.com/lib/pq"- Z9 I0 D% c( g% p1 d8 o
7 E- C7 t7 o5 s$ T8 |
"time". I+ Y' n8 f/ e+ _, w  Q

4 v* }0 s) z8 C0 {- ["log"+ ^0 O: L3 M2 V/ X, V+ C
" f4 j& G: C2 F+ ^5 b$ R  X2 d
)- C& r  C' j/ z2 F& ^$ y; ^3 y

% S. X0 `! h" Z4 J% H5 Nfunc main() {
) g7 G5 v1 X  o( F- w9 m8 x! I$ q
' p7 |4 f2 L; M* |4 c' e$ Xdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' \( g4 g8 H0 w. L, R1 [5 \2 R) H' i9 O4 }
if err != nil {, E4 O$ H( L6 _  H: E
- n, U+ h. ^$ |2 Z
log.Fatal(err)
$ C1 ]7 n, m5 x& k! d$ }' d7 i6 d
: T+ K/ B- q( Q& q. }" Dreturn nil" I  R: ~' ]' k: \7 f$ q
" D1 ?4 O1 X; \4 E
}; }: e, F  P; }2 Y1 }! l) H7 r

) T3 ?- S; R7 @- y3 _  Istmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")( @: W% r" M- `4 r% g3 `
$ b$ N; l( q  N6 |7 g3 B4 U
stmt.Exec()% @; A: A0 N, H0 q1 q# f+ j

4 m2 I  ?; I& h& x2 H+ ?4 _stmt.Close()9 o, ]; q6 a9 P7 c3 ^, }3 M6 `
0 c+ v; c) v% g/ e% Z/ a) j
}
& Y8 r% n* ~- ^6 _( j4 N4 k
- Z8 c. d# W5 I. ]2 x5 w+ d3 s二、数据查询 - SELECT( Q0 @( f5 P6 s! v1 X6 t
9 |0 A, b% d% S- L
2.1 : DLang 查询数据0 r0 B! O* n2 Z- ]

4 V) O5 P, w( A  Q% ^import std.stdio;3 T; e' p; `3 ?* _4 _
0 g# x- x: @8 q2 E: R
import hunt.database;
9 c/ {8 q7 A' P7 b6 B: Q# h( v" E. p3 K7 k% o
void main()7 ~% ~0 C- m; H+ Y1 D" b: X
- d$ N- G5 c- e% G7 ?7 _2 x/ }7 _
{
" W+ F9 ?# Q, L( P1 L, D. ]$ X! K- p" G' l" o
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
1 G2 `& b  }/ D
4 @# ^8 F; h; a; N; X: F4 _$ qforeach(row; db.query("SELECT * FROM user LIMIT 10"))& W$ U7 T: `+ G

# D0 y$ b( r6 S0 `{5 O% c) c& l4 H5 {+ B
: B4 N5 }1 P% |, o8 j- D
writeln(row["username"]);. r. E- Q; ?+ G5 C1 `; G# i0 D

3 k3 ~$ t7 a5 V, E  r- B2 v}& B, y. k. l5 O; V- A

" |. o* p, b) h/ h3 C/ _db.close();
$ a7 H3 A3 @5 A$ q$ V' w
9 s2 q) i) f) `5 W9 b1 h}' z0 D5 S' `! B7 S9 P- f5 E
9 p* P% {% m* u" }9 }& S
2.2 : Rust 查询数据
# `; [* l% X, [$ q. A, o: |* A5 q1 F3 V* O; q/ v: j
extern crate postgres;
9 r! s& {; ?8 B; U* z( o( t( U( |' A6 {8 N0 S2 M
use postgres::{Connection, SslMode};9 y! X* S) ~6 f$ s
+ N1 C$ p4 b8 U' }  }4 X
fn main() {
# `6 h7 S/ }0 \! E$ K7 M4 `! q/ U3 v7 s9 ]
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
" i% J8 [/ }; Q6 ~! f% _8 {$ [* N% F4 S5 l) G8 w2 {* B
for row in &conn.query("SELECT * FROM user", &[]).unwrap();; Q* _$ |# M0 e( F

0 h1 f4 R1 r/ [2 oprintln!("Found person {}", row.get(0));( V2 ~, Z7 R* J" z* p# W. y
2 u0 z0 h- V2 Q5 L" E
}
" J6 M- F" f, Z
- \6 P( i; M* {}
+ L+ [* U; s! e  Q  [- g
7 M- t$ p; t4 X2.3 : Golang 查询数据
( p1 p; k0 g8 \9 W4 _& h9 P3 y/ Z
import (8 T+ x; w+ S+ ^4 c) w4 }6 D" [
8 d% h" r) ^# j
"database/sql"- @. X6 `7 n# F5 I

) R5 J/ R' |& G2 s+ g* g& h"fmt"
; r; f& e; v* \3 H# S" H
, y  Z+ ^! |0 k9 `2 k0 p6 x5 G_ "github.com/lib/pq"4 y) G9 B9 }# S* z* {8 d
$ k. c* t. N+ ~) G- B- \
"time"- I' q8 ~) A# a) U3 W

+ S9 d$ g  Q$ A1 q6 T"log"9 x# \* o8 s( E$ A+ l: U0 g
+ L1 b; A  M" m" v& g
)" |9 @( J5 p% F" x( C

, v# i$ D7 q! xtype User struct {! d3 t8 Q- u/ D( d9 z

; k5 V6 A& y/ M4 y# w+ GUserName string3 ?) p( {! L0 r* i
1 n7 }  ?7 T  c$ g/ ]/ @& [: W" u% W
}% h7 v" o1 C- f1 ?( D
7 x- U* u7 z# D0 x; ?( J
func main() {$ J8 D: U+ x5 G8 y5 g. y
/ s$ E: r; g! _4 ]; U, x9 R* r% z
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); V7 u; _, y$ K

* `9 ?! \+ P+ Z& }9 zif err != nil {
, J/ `) O% n) }# j. N
$ x! q& q& o3 W& ~# Elog.Fatal(err)
2 l+ G- c  J. u! }
5 t; P4 A8 l# i7 @, s  _return nil3 `( n' w; e- E# {. ?2 l5 ]+ z
1 c" Q$ ?4 z1 q  n/ i) H
}. h0 m1 q4 {- F0 i8 |/ B
1 _9 {/ Z8 F9 ^3 F# j
user := User{}" C# S& o" h6 q6 z3 W

% n/ r0 M/ J, ]! k" W8 b! jstmt := db.Query("SELECT * FROM user")( f& k9 g1 f7 M2 g1 M
: [, ^: j9 R4 }- q, l0 d0 o  c
for rows.Next() {
6 q: o% H4 ]: @
% N: ~( Y5 r& L  {3 ~rows.Scan(&user.UserName)5 D% k" q: j5 e5 s

! C- y( I" r. }+ ofmt.Println(user.UserName)
  O2 [. c0 `1 a' y$ X" M+ ?% z0 n- s; A  Q5 C6 u
}% i2 p  x& N' w1 C9 V1 L4 U; S
) U. X8 _, z. F, \
stmt.Close()
" T2 h9 h+ ~4 o1 I8 a  f% H. w3 G* }- w! @+ M9 p: A+ n. w! L
}
$ l3 |, o5 h3 |8 d( J6 R1 H& q! O# r/ r! {7 L9 o6 H. N
三、总结
9 Q$ a' v+ \& D) }4 o8 G; w$ X
: e2 d. a: Y4 }/ l6 N4 S对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
0 A' O4 s0 y: X: A0 z/ e* f0 i. i) W" f$ U7 q/ W( R# x; P& O( Y  N
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 N- L0 \( U: W/ i3 z, P+ e! q6 \0 D& L) X& a! V2 b
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
; j) A1 ?2 s2 q; T$ y
+ N. i" H- m" \( x1 Y总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
- t8 F7 A( f% [6 a* n, P1 @0 Z————————————————
- ?) I2 j2 v5 B! V5 E# r版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 h- c/ d7 G( g& X' w: d8 ?( i原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
( b4 E, W% D4 G5 o, x8 G
; x0 ?1 m# q/ k% @2 E: s9 {- n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 08:08 , Processed in 0.069362 second(s), 19 queries .

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