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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。( h* I' n; H" r
3 Q$ m: K, }/ q& v9 w' M
一、数据插入 - INSERT6 V$ _) C: R5 L4 U  f
( Y3 T7 B9 x$ K1 u  G2 U( c
1.1 : DLang 插入数据
* e, ~# S4 t& S, V0 A! l' ~9 v; ?1 F" O, _5 S( x
import std.stdio;
6 W/ a& [0 }+ i" \2 }7 U( h# z# U) \5 [+ C6 A# o
import hunt.database;
+ w- B8 g/ ?7 I
! {, r: a' A% |4 i. a5 {void main()
% q4 z6 M. D+ m, z  j) Z6 B1 u2 G3 e: J6 }/ v  P* F+ Q
{
" N% g4 N; S/ @* i. W0 U4 _% b; _0 W3 v  X: m* a
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");0 K, e6 c+ y% `$ T

6 f% k6 w8 H. Tint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
; J9 C/ w* C. i* e" N7 w! d
) h4 v9 e( p+ C5 A// 打印插入数量
/ p* k+ e) b7 E8 a
( }+ L4 g# Y2 ~; ~# ywriteln(result);9 G& R0 u3 W: l  |. N

3 ?$ @* x2 _8 K1 O! kdb.close();* N& w- K; [1 K. x8 d
, z0 l3 y' l* I0 m9 H8 n, `6 N
}
. v: n8 m; g$ y, f2 c. i$ r/ ^; u! h7 e$ ?5 V  M' U/ ^. b! P4 Y
1.2 : Rust 插入数据$ m/ K. J. n, n

9 x. C. |7 T% n. Dextern crate postgres;
/ ^- W' l, o7 @: v( n) y2 i
5 A' w9 ?$ [6 o4 \+ P3 f% m/ Vuse postgres::{Connection, SslMode};
9 x! G. C, b$ F, H3 N) p7 S) p0 {5 A0 n! ?8 b6 K1 z: L5 s
fn main() {# ?; ~- k6 ]0 V4 s# Z
3 t+ h2 Q3 L; {- H! K
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();5 c5 @; t: z* [5 E$ O
% D; |$ e, }" V. w5 m0 K7 M
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();$ x1 A" b5 M+ g" s: ?6 Y  g
) W7 t& U; }5 @6 e9 P. \
}
& _1 F' J. S5 Q
  v) `$ @9 [$ ?1.3 : Golang 插入数据3 u2 P" D  f" x4 Q' x& S* k' L
( x1 B9 k7 H9 {( m; l6 R5 t
import (
1 V$ A* v" Y5 g+ l; m- }
* ^6 F1 S' m7 G"database/sql", q+ v$ F7 ^: Q3 l

4 I. U2 `) b$ d- o$ {( Z7 C5 h" n"fmt"
7 Y; S( j; g- b" [8 Q, @6 ~; w: x/ m* a2 X% {( H; n
_ "github.com/lib/pq"  B, u- B) z- k7 U4 g8 ~0 {3 Q

- b8 j& B9 n5 h8 j2 F  L! }3 W6 ^0 ]"time"& [! H' t3 B8 [7 h6 k! S  R
. _9 n% |3 A* D, A8 x2 c
"log"3 W) l4 q+ m# Q! D8 b
& g8 G* J; H# T! |0 C
)
5 ?8 Q, o7 ~% [+ k* \9 y! S8 W: \3 l% _' d6 `/ {9 P- E
func main() {
' \4 A9 J: O9 U0 j( K% R4 Y2 v- e# f) m
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( V/ M  v+ o# Z
& a2 C# u" d* k& C' X$ s8 b
if err != nil {' R& x( B0 [: O3 Q% n2 D4 L5 \

2 M+ ^0 P0 m" I# a/ blog.Fatal(err); r% r( E5 o6 _3 {" |. Y
: j+ Q' x/ p- m, A. ]3 C
return nil
7 O5 p" R. t0 R+ B  K3 j9 S, i# N, ^4 u* m. G* K- D0 T, e
}( A" k: B* v* q4 `/ S

% |: f& h% N7 H/ n# Fstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")$ |" h; n/ O( m: z- H, X$ M/ o
8 I3 i5 O: f1 i9 {1 u
stmt.Exec()
- [: o6 [1 G' b" T2 c% ]
! G1 {7 Y( G: j3 M5 P# ystmt.Close()
0 t, H% R5 s0 B: B3 \8 T# C+ ]% B& Y  \" _7 B, ~3 L' k
}
* _/ o* W/ T- k9 \+ F% x6 f' ]/ \" Y3 |$ e+ R+ j
二、数据查询 - SELECT
" ~9 g  L1 z. @/ j* J0 O0 `+ u$ {; S, k1 U5 g; m9 ~$ w0 H
2.1 : DLang 查询数据7 K$ i5 `# L! p& C$ K
! e. v, p7 ~1 d& F6 V' g
import std.stdio;, a" L( l0 u6 v+ j

* ]1 f6 Z  o6 y6 j+ L; m) zimport hunt.database;
! B$ k* v3 @6 W- b
8 A3 [2 c, X, c# \' T; e$ pvoid main()
1 V/ K! }9 X* P6 l1 `5 t0 \$ C, I% A# I, d9 ^
{; O) Q' n* @) z  z0 A  y

, f: f' L: x( D- X! aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
1 c" m& D' F( u2 @: t  s
  _# C! ~9 F# x3 u8 L/ S! qforeach(row; db.query("SELECT * FROM user LIMIT 10"))
) {, i- F( V+ v: m9 J/ ~" s/ J* D2 n& f7 `- X# P% z& t
{& I; @  n, W* }- _, Z) F
4 _# ~3 c% F) n, t" J: j
writeln(row["username"]);4 G5 p! P  T. w6 w% k+ E/ o
4 n$ _6 r; t2 e( y7 D5 g$ B4 f4 {$ r
}
5 P$ U( e9 ]5 b0 ~9 h7 d8 \3 k7 U$ |4 ^4 B0 }' \/ L; J
db.close();+ `4 m& K( D$ c% U
- \$ V% k' @/ U" i7 H
}. X$ H, ~7 ~, Y  a
0 `! X5 t: j& W, L1 c( Y/ w
2.2 : Rust 查询数据
& B8 L' r- k, V5 [2 B, T3 x
+ V: }) E" q- k8 B$ [extern crate postgres;2 R+ c& k- r0 y0 o

* _; q/ k5 j- }; n# {  _/ ~use postgres::{Connection, SslMode};
( R$ X- A8 b1 S# C
! F# S- a' _% S8 V- b7 ?- k/ Afn main() {  J( X4 l6 v  I
% X, p% g& [" Z
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 a7 p2 N% j) L( x3 E

3 J; h4 K8 s: O* m4 |3 Pfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
: a, z# p. j) D# K! C: ~  _! V
$ Y9 ^; j% T+ j0 A0 u0 p" ~8 Cprintln!("Found person {}", row.get(0));# q+ {2 S2 l/ j/ ]% K4 B- x( r+ Y

# l! t+ u/ |+ D2 v8 O- {}
/ H) C% O2 @! b; T- G" z- I6 ^$ t) o1 P  \1 W2 y
}
% Q/ s0 ~  ^- G' Z1 J
$ w9 h4 s/ u1 m* F) l2.3 : Golang 查询数据7 {$ T" P) b% M" K+ S  _& n* ?" W

2 y- H8 L% O$ K+ j: ?1 yimport (
+ O9 f5 `( H5 Y( r: d
; i( v, |' D% d"database/sql"% ?2 k& ~5 J& _: V3 s! n- m
) A# h! @: C6 ?
"fmt"
9 N  N1 o( S! Z& K- |5 I# V' f$ \  i
_ "github.com/lib/pq"
! K" W/ j1 _# e  D& s* y! p" s4 I6 L
"time"
/ R5 @3 _4 L" i# c  l7 A
- u; i3 L9 T. D, l+ {! Q"log"8 `  A1 N6 i: f1 D: [/ {

, R5 ^) X/ {8 Q/ }' m)
4 W  y9 }5 R- i! V/ U
1 d* v+ J. x& I. {& m; ptype User struct {9 H, B& @8 Q, s6 j' P$ u( n- }

6 F' h8 m" K9 @UserName string
8 `  v8 C% D6 t
" B+ m! e1 Q5 b9 e- `2 b0 b4 K}1 Q. i# J+ A+ j/ q

: l( S! ?, A3 ^( [. p4 @func main() {/ u( B: n3 T5 P: P
- s( Y0 g- C9 E( G% P! P5 B8 b
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
$ }! I4 L* X4 G6 q
0 @$ ~; u- k. [2 {6 Z/ [4 Nif err != nil {
7 ]5 a* a" s, ^& e( _
: c. u3 x) u( c  I' l1 ^  R; Llog.Fatal(err)
% t- Y- D6 l5 F, @2 s
8 T7 X8 |6 H' dreturn nil
9 j9 `- c  z' k1 J1 T% d+ O4 g4 D9 i1 y2 [' H- l" e  U& I
}* [) t* ~4 f, ?! ^6 s  ~/ P* |& m
+ m5 u  P  t- j# x- T0 _1 t
user := User{}
" S- I9 n& s! e- H
" x! o+ K! Y4 o- hstmt := db.Query("SELECT * FROM user")% B! J  b3 N4 K0 s+ Z. u2 {1 c2 O
* ]# [, }' Y8 }- t& h
for rows.Next() {" n/ O( _/ x2 f$ g1 Q
: F+ x' H4 s0 a. @
rows.Scan(&user.UserName)) `- Y2 q, [9 Z  G7 w& X8 f4 I

7 }; k1 \9 E: c' P/ H7 Ifmt.Println(user.UserName)8 \  z1 H5 _+ U# i
" p6 X6 v2 m$ m# `3 @
}
" K; L. d# [2 Z$ B. C  s  `2 O# Q& m3 c  X- {* _' I
stmt.Close()
  l# \1 e' C3 q) p* d3 t2 l* x- \& z4 j9 c. d  a3 o
}
5 g0 |& ~) z! S2 d! C
$ b+ o0 K2 W3 d' V* U三、总结
# _7 u1 G' [! z2 H/ x% k* q, o1 q/ p# K, L. I$ {  m" V
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) [2 J; r/ m. m, T; w5 L
6 K8 H1 }9 a6 \# j) w
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
1 D2 j( t+ L. F2 a, c) n$ a8 a; b3 d) A
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
5 N- }* w7 ^% J8 F5 J
1 d1 }5 ~( J5 g% u总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
7 h3 z  _/ F7 V0 V) H. a. C; O————————————————8 S- K3 w  x6 V) Q7 [$ C. ^
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* X& G( F  P6 ]( J! p/ f6 b6 C原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339612 T& ~/ {- `5 N8 A# B4 t
6 S7 T" b" n0 y; D( H2 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:19 , Processed in 0.055272 second(s), 19 queries .

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