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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。9 u7 O. P6 e- [2 D; h( n, K! G
5 |- j. s) h9 {7 U
一、数据插入 - INSERT
6 k1 @# ], i, Z7 L" l# f9 h8 C9 O
1.1 : DLang 插入数据' ?- |7 Y" d) R+ W& x

- L" q9 O9 Y& Bimport std.stdio;
) M2 ]: S0 j9 }' q, W, M. M" j, E! V6 T( j5 y- W/ [
import hunt.database;
/ }/ U; c6 Y8 d! W/ L
, c3 o3 L/ u" u- ?- Bvoid main()
/ b' o( k7 E2 S+ G9 M4 p  K: r# x" q1 o' }: E
{
3 p6 B& O7 x$ Z% Z" Y9 `. `4 T) T: o' F. D5 L2 u7 H; v
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");2 }7 f" q' @7 U$ \3 Z1 }
9 R4 o* G1 V6 K, ^
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);% }' ?. M& x% C% ?

/ a' D, i1 ]) a/ @1 G// 打印插入数量
' Q! d( n6 X9 F: ~- ]1 o7 e0 `0 E# y' d" v
writeln(result);
1 k, M) r2 O8 t7 ~/ A6 S# q' \, Q) C$ O4 S* T4 Q8 }. c. Q5 R. K' @
db.close();- u# F- h. F# s. o/ v9 c9 ]; t

; {0 Y; o+ Z% E  `/ `}
" Y& M, f3 |! L& ^3 O' M) E5 ~- W3 T7 R: [3 r, r7 x
1.2 : Rust 插入数据
4 v4 p  \) M; L/ T' y" T2 y( y5 A. z6 V& ~" y, T" \
extern crate postgres;( m, Q7 |4 O& h0 j/ |

# L& Y; O3 {  Q) M4 q* D( Uuse postgres::{Connection, SslMode};
+ x  p2 q" f5 m0 Z6 W7 |
, J) b  l+ ?& gfn main() {
/ r$ o+ E# K3 ~( b* {" [2 C% q& x) l) e, Z
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ R1 c; C6 R1 p6 C1 N+ |+ z; L: V7 R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
: v. b+ r' u) t  L4 A/ n, [7 x/ d  x7 b! `( L
}( p8 h! E1 c- r: [

- g) U- q, Y: M' d4 N1.3 : Golang 插入数据
7 ]8 K7 y* K4 j8 N; ^( d- F6 F3 H/ m* ]/ R" N
import () e# C) \+ |0 [3 I* I4 q  `1 h- ^
% P% |; V; S: ?* o: K
"database/sql"% Q/ T. N  B6 r
" O0 T8 v" n- h8 ?( Q$ R
"fmt"
1 A. X3 S. I' _" j# S3 v" m7 R0 o0 ~% U
_ "github.com/lib/pq"9 P* ^7 v; v) u' s( X( Z
0 E6 m$ c7 e1 A5 k! }
"time"
1 U0 o; ?, E% `( K, T6 A3 `' R1 `: e- ]( t( \
"log"& R: L* ]- q$ W9 @& m/ |$ B
; a5 G! v# t1 e5 q2 {  h4 m
)7 v& k6 ~. @2 ^0 _( S# P

8 E: R+ o% N# nfunc main() {
( [7 S; C) c7 z/ O% s/ c, z4 @* j
* p% L% \6 l2 V) w7 y) [, udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")4 U8 H5 p* _+ I: T6 m; \
& v* Z; p3 N' {2 a, P
if err != nil {
! `: |# R' A; d+ b7 h% P$ M$ T4 J% B0 N0 ~% }
log.Fatal(err)! ^6 a3 V/ I% G: s; K: \7 W5 c
- x: ~+ ?, J. F: G
return nil% c. U  d- a  A$ E7 [

3 m. z2 L8 d% V7 B% D1 g+ I}6 t: i: o. ?% Y) w; J: k+ d3 K# g
( |+ l5 j% `5 r8 Q
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
$ m8 o6 I% t9 Q8 U: h" T  s6 C7 B% a7 Y
stmt.Exec()
, H' |6 g; N/ p! e
: s  A$ e6 Y4 i6 _" ]1 B5 d8 ^* h/ Sstmt.Close()
7 g8 C. O; o" y: v+ f# z7 P+ g% f9 `  o8 F
}" l; q3 y; E: u7 n
1 P* Z/ E# z2 O+ ~3 {7 s1 y
二、数据查询 - SELECT
& I! U9 G5 @  Q0 W0 S
( g; z( M5 Z: |% N( Q' I2.1 : DLang 查询数据/ j1 f0 `$ X) {, h: W# y
3 B2 w$ L  o/ |  ?* S% \" Z4 |
import std.stdio;
! s! G' X( @) R2 B; Q6 N5 {
/ E8 A% Q: g- Z* \import hunt.database;8 B  ^) d+ Q+ X9 X! j. k# ~
4 q1 y6 U9 B# L. Q1 {8 A
void main()$ C2 W. M  x6 B: N7 T
. B" S9 o: J5 k: L) M
{. y$ M2 h; N; n- D- o! Y  f& Q; |

) [% F  j* V# A9 iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
6 u5 Z; Q$ L& q& c9 P3 x4 Y5 @1 Q" @8 i; }% R9 f8 C8 [) }: O
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, e4 a* z% b6 ~3 J' F5 b2 b# |2 K$ `- L: h9 U) g; O) q9 C( H
{4 U: K& x  W% d; J  Y$ {
* ?1 t% }/ l( U+ U6 G
writeln(row["username"]);
  l/ V( S. F3 k5 Z) |* f4 n/ G1 z
}
1 O, ~& e2 x# d; f" y8 I6 r0 d3 C# R# w$ e! r4 O/ j
db.close();  P) c" ^* ?3 T  R/ d
; M' Z) \# K) C2 B9 H7 Y, N
}
0 D& z* M8 }5 O# [) K/ [( C4 X7 j( X2 `% z1 U3 ?
2.2 : Rust 查询数据  ?* Y' d: E, I) u  k7 G" C. ?/ j

9 w8 k( K2 z. `9 y2 Fextern crate postgres;! |$ ?/ p- N4 V0 P6 |
& U" k/ C& `% o; l' ^* Y
use postgres::{Connection, SslMode};
" I+ J# G# y5 D$ R9 R6 V/ K) f: M/ g/ x0 t
fn main() {1 [, z' E9 O. _5 X( `
2 X$ r* o2 x; k* Y# H* E& V) K
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% N0 [. |4 l% i6 t3 Q

) _9 a. q+ O) i, ~' o- I& u6 efor row in &conn.query("SELECT * FROM user", &[]).unwrap();% n) b# C, }# v6 g) O* ~

+ Q- X# C" A0 j4 Uprintln!("Found person {}", row.get(0));
" E# M% p0 ^: l; V
) L5 R' ~3 X3 ^' x: X' `8 w}
1 T, U, z5 G# {3 t, ~1 b! t& ~+ }, o7 G& ^
}
" m6 S  O( d( ]/ \- V4 Y
# Y9 R4 Z+ V# h7 v* G& g/ ^2.3 : Golang 查询数据
& p) n, p9 |/ \3 e9 L3 c9 h: i9 v1 u) j* h2 ]. o. U% U$ N# |& P( z7 W
import (
: L, g% v0 q3 g! Z5 l# Y/ S! U9 X5 N8 D# R' G/ o3 S. P. c
"database/sql"
6 z. c1 Q: Z; d- d$ N5 {+ a
$ l/ ]: v+ M1 {! {2 c"fmt"/ |8 M7 i/ [% h; J

2 f$ m. \) i3 x% K_ "github.com/lib/pq"
$ F/ T, V; t) b: A+ K7 L  `/ @/ u, Y! S2 F9 k; r( c
"time"
, @1 K! }- b& y8 v  \, q  C! R- h4 h2 Y# o3 L! t8 {
"log"
' R" F7 ]! z8 N# n/ \0 z" j0 [4 e' s% S  n- \& u) O
)8 @- D7 f. y/ \& D1 s5 O1 m
; R" ?2 _) |0 F) w- n" T1 s
type User struct {3 F7 W2 n2 G4 E0 \9 W( S4 C

, @  D4 P- `* H; v# ~8 r: t; [. NUserName string
: C  ?9 w3 f+ z" `  L' A& l- T2 g
}  L. U; _8 g7 j3 ]
3 o' y4 ~1 I1 d
func main() {
( o# @+ B: ~( j1 i4 j$ \- B
3 Y4 F+ Q( M/ [7 w4 bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ t$ ]/ ]/ I6 i' N7 O' }
( z: X: j  Z3 ]4 u7 _if err != nil {3 t3 [; f0 _9 M
8 u$ q6 e" r( S% [0 p# e
log.Fatal(err)* ^3 A. \$ x9 a, _7 {: c
9 h" F' n/ t) O5 q3 ^1 l" V/ E3 M; z
return nil- N1 ^' T9 A  O" g

/ _' ]6 W( G# X6 w5 ~8 ~) q0 U}+ @4 D" _* e% L* M9 H7 T

. `% {9 D4 \' @9 Tuser := User{}
' f" U/ ~5 t" ~9 `+ n5 r4 ]0 z* J! d) i- V0 x. ~7 g, v5 [
stmt := db.Query("SELECT * FROM user")
8 B! E/ |  e! R, \( B! Z
0 z6 n4 ?  H& G! I: V; Dfor rows.Next() {! ~' ~/ ~  x. A' C* r' z/ v

/ [3 J) D# ]5 y$ [8 Crows.Scan(&user.UserName)8 @/ f3 e7 K- q0 K3 ^+ t4 [& a
# S8 V% d, F8 w6 q
fmt.Println(user.UserName)% Q! q  ~7 t7 }: D

8 A% e! h, ~3 ]& c) u0 j}
  M' A5 D2 ^! q& a0 ?
! h% G) o( s! Y. V& Xstmt.Close()6 D9 a; c: {  u5 I% Z

* N4 s, P% o& Q8 t4 ~}
3 @4 N# D& K; N) V3 i6 B; w0 M
1 v1 u/ C! N8 E% X3 V$ E三、总结
. S9 p+ w) W5 H$ e, g- R( W+ x4 P7 I
; _% f7 Q% Q& I  ]0 I  u对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。9 I5 F5 K" U0 D3 G- b2 C' H" r; S# J, _
* z+ i5 v$ N* `- v
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
- r' n5 \( f6 C! |0 G
4 Y5 Z1 M0 f  H; }$ L4 W在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。( A4 v) \2 E0 e6 D- O4 X

  i3 X2 e# R) x& W$ d总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。( g3 J$ h1 g) H
————————————————2 r7 W2 _# o! z% L; f  I" @
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- K- y" D0 {4 p" U9 a! d' ]9 g原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961# ]$ t1 I3 t- @( J
! f9 i1 P: p" ?7 J- U# P: U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 19:21 , Processed in 0.136195 second(s), 19 queries .

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