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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。6 G  b' i/ w5 Q3 V6 W2 }) @6 F
% f; r; [4 k" |- I) |! D- T
一、数据插入 - INSERT% _- Q6 G4 A) N" V" i" S
3 U% t: [- v; i! ?9 H# ]0 s& G% {
1.1 : DLang 插入数据- {, t3 T* P$ _; W- D! ?
! E" i9 D, Z% \% b3 \8 w
import std.stdio;
1 w5 ]/ v. ^3 F# E7 U: K! q1 [1 }
import hunt.database;+ U9 e" X0 P3 |* U$ Q
* ~1 o* y" D8 H& ~$ Y. |: c
void main()+ p- c0 D4 a4 o) I3 n% Q

" k4 s' ?, b0 }1 @{/ J% V+ B2 O; k7 V, R- g  j/ o# H

3 Y# I6 O$ t/ v$ ~! M6 @auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
. Q: j7 W' F' q. k0 ]. _# T3 m, R, u# N0 }
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);. j0 k8 L) b0 k2 U+ @
) K: N7 w6 b% u) v. @  \
// 打印插入数量4 K: Y; Y/ Y; I/ W, N
5 U" y. y$ s0 |' x, x1 g
writeln(result);1 m; X7 t% |9 m0 o6 u
8 G: l$ H6 s( b( @. l
db.close();7 b) J5 y' c0 ]( Z% z2 p! B6 B
8 r! H; y9 e, U) L" c3 ?
}/ ]5 c/ B+ @2 I. @; p; e; A
+ Q) G$ n) `3 m" F) J
1.2 : Rust 插入数据
7 H3 K1 D) A0 Q6 K& H/ A7 P+ f4 p4 o: u$ C
extern crate postgres;" s  {5 a' @! B  t2 V
# h' _- t2 F5 f; x# u
use postgres::{Connection, SslMode};: k1 T/ |3 g  @/ F: U
/ l* M: R5 ?5 \
fn main() {
2 D  F6 T8 O5 K( e, j. @/ f, r6 f$ v8 t, W
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();9 a# Y6 f9 b/ S: H; Y: S  T5 b
. Q6 U0 d8 T- H2 f
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
0 e" \: W% x! P  {5 r% @9 B' d( U: i6 S3 N: K+ g, C
}
8 `" k6 h& l# e' R' W! T7 S: M7 U2 e5 O+ R3 {: k' J  s5 q: ^# \$ Z
1.3 : Golang 插入数据8 _  n  P0 i# ]6 f% i7 v/ k
  j. `2 Z& g/ H
import (
* ^7 A6 M+ m% U" q* P/ u! X: F
# X9 a% n# a! @$ @+ u2 c) R" i"database/sql"- y  L# A" |) l  Q' U6 k( O
$ T4 ~1 X, w; @( U
"fmt"
5 X. N4 G$ B. B9 ~  ~
* e' x" F; h: D( O3 ?$ E_ "github.com/lib/pq"; W, e+ M, l) _% ?- s
4 T+ B0 R! p# P7 y9 c/ O5 D
"time"9 B7 i3 C* m, C$ }: v
5 h" O' u3 F$ [4 M0 R
"log"
+ K3 ]# W) F7 _. e4 h
( @( v; G) P  q$ ?7 W)6 l& C6 [6 Z- q( ]8 P
( s1 z2 u5 x2 L, n6 D. r# ?
func main() {9 A3 `2 {2 r7 g# S' N

& ^( R% [1 q0 l' Zdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")% m4 _5 Q( Y' O( `% m- M
# k+ x# t# B/ S4 L9 x9 D( t
if err != nil {
3 c$ t3 s% q) `6 t0 B
5 _" h# h# \: ]- L! }/ I7 a/ }log.Fatal(err)
$ S+ Q3 q) }" ^% z8 _8 i9 l/ W* d$ {; u* J! x, V% Y
return nil! O1 y! u- V7 |2 M1 O

# s  f9 z& }: z6 P8 r}
7 ^  `  g9 _6 C
: h  b& C5 \  m6 i/ S( xstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")/ U) I! k. \# I$ y

' O$ F( _/ o, |( G, Rstmt.Exec()
# j: V+ v; Y' i0 x$ ~# B2 o& e" T0 I( ^: ?0 z4 l& [2 c6 |( a; k
stmt.Close()$ L( e! x% m3 I- o
& b! T' }4 v2 A, N4 R6 f
}8 L: u! ~! W/ x: [5 |7 q# m
; R' [! w4 B" g  w: t/ C
二、数据查询 - SELECT. a- |7 X2 ]" g6 Z  `  e* H
. }# |  x: B: P3 D$ w, R
2.1 : DLang 查询数据% T1 q/ f0 B& D1 Y* \: }
/ F! N5 c3 i; u
import std.stdio;! R) G( Q. a6 K$ }" D( F

2 b. l' H1 H+ o" t. bimport hunt.database;1 Z' a/ L, F/ I/ M

* R; U# {4 H4 @  K, B0 k, gvoid main()
, Q: N+ n7 F  T  E" u% Q3 C+ U# E' x! D4 h$ D+ L
{
+ @# g1 t- E& u1 z( E" i( v( w( Q' |" ^% \! o) n7 E! k
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");+ @& C* C1 T  A( I/ X
. {# l# \4 _# N# k9 B$ A& H1 C
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
4 q% Z, E- }4 {+ p- @
' D* E8 u1 Q( W  w! j0 g% V$ A, I{
2 \# `/ c7 I4 t! e) n* b$ r, T) k# O, z1 ^+ o  V- o' T
writeln(row["username"]);
: A$ j+ m! |. G; K( u, H/ t8 t8 v4 B' ~# d2 g! H4 g7 r0 ?
}
- f" O1 x3 ^' }/ x9 K) q
4 k9 [6 e/ K& u8 a4 L  Cdb.close();: ^- N! G( F5 }
9 g, H8 d) U' x- Q9 I
}5 Q. A/ j9 J. d% W  d
: i  W8 `; Q3 |' F( V8 C/ f
2.2 : Rust 查询数据& F1 P, u+ x& d5 `9 \* l$ k3 P$ I

# c, P4 z; U5 |extern crate postgres;
# q; a; i3 G) V3 U/ Y
5 X0 T' k0 u3 s' uuse postgres::{Connection, SslMode};* {' Y- P3 I, ~# O$ {

- ?$ z# \- w$ j4 Q' Tfn main() {; v& g" h2 H, I  o+ \$ L! e& e! O
" }. V2 A* {4 q5 r$ P! |
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
) H$ U/ y4 c& F" w; V+ H- s+ N$ P0 q1 y) c* I. w* r
for row in &conn.query("SELECT * FROM user", &[]).unwrap();8 \: }: n4 D( u0 ^$ j6 [
& n0 S+ j2 ^2 |  b
println!("Found person {}", row.get(0));8 a# H) n" u" A

( s$ W" W# n" D3 ~  v+ G}
! I2 T% @# f4 b0 T+ R  H5 a5 q2 d& h& @5 l  t" y
}
7 K5 B3 c/ z7 J7 c
8 O  Z1 T& u7 X- `/ ~! Z3 c2.3 : Golang 查询数据1 @8 e3 |3 K1 @  b5 `4 C

& E* Y; x& b2 j) Y0 I9 ^& }9 Aimport (0 R; u2 l4 k# T  J, A( b' T
: l! W1 K# x1 z1 ^  k* s
"database/sql"* e+ v5 w* t3 _0 T& @
) ?0 \2 b1 p$ q1 |* S- W% O, q% {
"fmt"8 `! i6 \: l$ d
- I: w( M% g, U- Q) h
_ "github.com/lib/pq"
( F* i6 o' m2 B) P' v) I5 A' w' L
# P4 p5 d* s, I" n# j3 Z"time"
! k$ j7 i% i4 v* x0 K7 ^" n# a6 m, t. q8 h9 U: c1 O1 L
"log"( ]4 s$ O5 C: V+ ?$ Y! o
9 `. q$ P! k" c- A$ X5 O+ z
)
6 b: E4 m8 m& i( }& x, _1 z$ `9 h8 h$ i  o- Q( B
type User struct {6 k1 a3 m$ E0 n, t$ x* H0 {* e
) T4 B: p9 r% C/ N" N% ?. H5 @
UserName string' Z. P' b' Z% ?2 X9 Y9 h9 H8 g% Q
' B) x5 {) R# x% E$ o& M
}. o% ?' s+ D% f5 ~# ?

& a& n, Z( V6 [. V& ]3 @/ Gfunc main() {8 s7 h; X! R: I8 S# g

) C) D, \2 Z# m3 Y, r7 s8 tdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: D6 ?- ~3 H2 k% N- B6 o. r4 P
4 R9 j$ y4 x: Q" o- s; Q9 p! kif err != nil {
9 [% {" a3 `  H1 ?/ ]  ]7 O: h" ^! t/ V  o" E) y8 V
log.Fatal(err)2 K& R5 w* H4 ~1 z8 D2 o
) C# `' }9 Z8 ]
return nil
1 l- D. b/ s# n' e* i. ?' B: r. C1 Z0 r" m4 s# f
}
; [$ O; X5 f/ @9 P" f, @. r/ p2 h
1 C7 `: Z2 e+ Y# [user := User{}. {" i' C& p: x/ J( I7 S4 m! e+ `

  P/ ~) S2 {. Q+ q- Hstmt := db.Query("SELECT * FROM user"). B6 b4 U4 l/ R
; b) f5 w* q, b) Q1 M4 R/ L
for rows.Next() {2 B4 ^: s  n* P" d" O" t0 i# L
* N# Q) S9 d/ l% X! F* Q9 O% \  g, Q
rows.Scan(&user.UserName)
2 C. y; z5 }+ K/ E$ b& E, Y
+ l% q$ M9 F: o7 y1 lfmt.Println(user.UserName)
# h/ P$ U4 ~& U/ c$ a) p& E
9 A0 y3 [2 j2 O3 k% _: z0 k}
, G* D4 R' j* d  q9 y5 D5 _  L3 ^0 m0 v" z) ^4 `
stmt.Close()+ y" a2 P. K. A' v7 n) E
1 u. H" @& F9 V$ g# l$ q
}
* N% E% U) k2 Y+ [- r2 |
0 A+ f$ ~; n1 i9 Z' `三、总结: G5 J! H2 |1 r4 M: H5 q. U

  Q5 F! t/ c/ t5 \: z4 f3 e& c) b- d/ t对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。0 A; n) a9 M- H- H
* [0 b2 C  k; \( X  B7 n$ d
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* \- w! }) y  _( P+ K' O) d
$ J8 I, W, e( Y' ]: k在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。8 _- z' d# a' a, r

) g% u! c# ^% Q% c3 U# g3 X$ x总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
6 D# c( j8 f; m% {/ x————————————————- j& a3 h: U! a" X  \
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! L/ A* y& g* z' t% t4 q原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
3 F1 W6 m1 F$ S2 F8 q4 d( d# ?3 A7 w# c# R' \2 J. k- g* n+ R: W: _' n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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