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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
" E, r" b  |3 H9 O: U& u
- q8 I8 [- X7 d; t一、数据插入 - INSERT
9 n; l% [! Y6 \4 G+ I) {/ y4 T0 Z) t5 M
1.1 : DLang 插入数据- I% k  x  O+ p0 o: W1 [  F
' a) Z% |6 C! N2 }- z$ [/ @; B
import std.stdio;3 k& ]. L/ {+ Y# I- J# u. x% x& A

' v, I1 U% g8 J; O, ^3 [. v  n, V; dimport hunt.database;1 p" j) o5 p. ^  Z3 [! m& Y) X
6 J$ e$ a3 E$ ]- t# y7 L$ O! W* Y
void main()
6 O# B! `7 ~2 |2 Q
1 J+ _( c3 m8 K4 V{
. e/ v5 b' n  ]+ A
9 r, G, E+ R& I. |+ F- C( ?% ~auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
  U* [, n+ x8 O2 T& V, s3 z* h
$ R. K8 z- i2 m) z. A* mint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
2 `) z( |: o( p( _7 V  g+ x6 a5 h' T$ O- }
// 打印插入数量
0 `: }# w* t( V; d) z0 D% N  [, p
writeln(result);3 K# D/ g% U5 a2 ~# o

8 u6 r8 p; D/ J- Qdb.close();' j) d. l- Y, O6 B
. ]0 |8 @3 ~6 n
}
5 i3 @4 ?6 e0 y  a4 s
! a  p! R) K! L, j) m# \' p. K" S1.2 : Rust 插入数据6 E: U8 g0 o  Q% }9 Z0 r

6 l$ ?& ^6 F3 E2 Z* Hextern crate postgres;
$ h  {9 j. Z  B1 O" ^# l7 I. k- c/ B! U  |2 R4 y$ A
use postgres::{Connection, SslMode};
- `+ q- c1 T$ b
* z2 t; h$ }# |' hfn main() {
* f' ?1 i* K8 U
9 O$ x6 u6 P( y$ wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 l1 q. D7 i" T- m% [
/ w4 o. h; O( N( I! wconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
$ n; |' g2 O: I7 [& ^! z8 _$ {
$ N1 i* \8 n1 P- ^1 z; S. F}$ [  S3 c# A" g5 J6 M9 w2 b

7 [; \+ F  D! @+ ?) Y; f1.3 : Golang 插入数据+ W1 v) H' w# j* w6 o0 R8 v. H" Y1 q
) O6 Z3 b! [' M- y2 j
import (
6 d5 z/ {7 `6 a! ?1 c0 _, O" x& r% I* j* e3 l' y0 \2 i6 a
"database/sql"
! ]; j8 |. _8 O! v8 g9 E" H7 F- O$ b& ?
"fmt", n* e/ Z/ u* o- B9 X( b4 t6 X5 V

, H8 U2 _- Y0 P9 C% T_ "github.com/lib/pq"* ?" _) d  a' D+ e9 }: z

7 O4 ?, L# y  o"time", g' C& i0 R/ z& g" J/ B! U
7 ]/ J& B' B. Z
"log"- w0 h7 X0 E% ^6 l! M

: [3 R5 _& w' [$ J/ U)) I5 w8 @  q$ Z8 e

5 K/ w/ B% I* n! B( x. |2 h: G' ?func main() {
. v' k# [" w& L2 `( {7 P
0 W- J5 [# a" y, ?* @db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' ]' H: g) c4 M2 u$ e; `6 K
8 p5 i9 B: t% p' g, l6 y9 W# nif err != nil {) T2 D- i; C( H

( ~% O2 H% m6 z2 rlog.Fatal(err)9 I( D9 c5 m+ n) {) w6 c
- F" a( D. N; _! x$ Q: x$ ^
return nil$ v, u& N7 r( O1 B
$ p3 K0 s: g5 _. n8 D
}
& |3 Z" K) F; a& N
/ i" K+ i7 b* `% p- r- bstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
5 |" ?7 e$ A9 m- T% G9 A+ P7 ^2 ^# Q% |. h, }; j
stmt.Exec()
$ ^' e4 d% D6 b& @' ^! ~% D4 z$ |
" i( N( }% C4 Y+ U8 G, ]stmt.Close()
6 H7 @' E/ V: V, t) Z
, V- i! |  }7 V: k}
$ b( Z" S+ n5 c, ~
& h. \1 X7 S  W. `+ [. J& u$ w二、数据查询 - SELECT7 y2 H$ y0 Q6 H& Z' P, Z
/ ^. q8 n) ]- W, l
2.1 : DLang 查询数据
! W! h0 n- |9 a0 s) \- |! L) z8 S9 A
import std.stdio;' V; A% P+ M4 J; F0 T

8 |  i5 _% `, E0 N; J+ Limport hunt.database;
- ?$ M" ~1 ]) z, F0 a# Y
( x2 m/ I# Z5 w; _1 [$ u# Bvoid main()
+ D# B+ K6 U7 W; T% v8 u) E
4 ?4 v; l! }3 t) S% c{
- h" c8 d  `. r/ |
  `5 y2 |3 t% `& D  oauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");0 t7 u: M$ u: B/ y+ f

- C0 T# ]! O' Q1 V+ y! l% l2 cforeach(row; db.query("SELECT * FROM user LIMIT 10"))
& d% P- h  ~5 N& u- b  u. D2 F( `- o! A3 h; Q$ ^
{
: S& a4 P4 `; a) \& ~& B0 n& |
& U) Q& x% y& Pwriteln(row["username"]);
( A% M( k* _" f) X3 T. L" f
8 v. Q+ d# p% N- M}% b9 ~3 Z$ s5 @

  g' ~6 h! q  Q6 J$ [db.close();6 U! w, n9 K  @. ]( {3 n6 c

: ~$ \5 Z1 h# i; J}
+ ~2 D/ }* Z1 `+ g8 V
% m0 p# ~# [- W7 l( h2 l2.2 : Rust 查询数据
# _* ^8 k* ?: s  Y4 H0 w/ a- E! Y& t  o* [" g
extern crate postgres;
& o: f; P3 `* W- f# |& z8 J, k- x- ?- V6 ^
use postgres::{Connection, SslMode};
2 D* b- R- z4 y9 b7 S; r
+ L8 T9 B& h, X7 H/ g( Efn main() {* S# _& V* B( V) s: S2 Q9 f5 _
1 Y5 V  _# B3 l
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
! j# L, d4 f8 Z( V. v8 a1 M& i* [2 w
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( J3 D+ z$ ]5 P1 e
" q! H6 h* D( l- d  T& w4 B. Z% Dprintln!("Found person {}", row.get(0));0 U+ h3 k5 J9 b7 E' r  ?

- M0 r( I2 Q. s$ r8 ^}# b- s2 S- u3 h0 i7 d
1 ^- K4 L$ x  N
}
- g9 ^( b' j' I% B& {& ]
7 v! [+ c7 ~1 C! \: }( B2.3 : Golang 查询数据
( x, `  `) ^$ E2 y9 C- c7 Y% S3 v0 H2 Q+ Y$ v+ h0 l
import (( l. Y1 \- e5 I. y  D' p

" e# H4 n  S+ z8 x8 k"database/sql"1 k1 Y# o+ f6 o6 ^, [  t

; Z8 W) e' j( G' L2 F"fmt"* R3 R$ f: ~: I& G' N

0 d8 ]( P* M( |  c: }; j_ "github.com/lib/pq"
, J7 W- g- _' R' m* v8 N& g
8 _1 k2 h3 u" Q+ s"time"
9 E, x* \" [5 w8 G2 X% d: y6 F6 \# V- N9 l& ^
"log"4 q, s7 f  u6 U+ q& F! ?4 U

3 w1 y+ g1 L# C; |# D)4 L( J, {$ F: L( _
# V3 R7 B( L0 C- J$ k
type User struct {* r5 ], U/ E4 c4 [8 Z4 ~

0 X6 V# k3 Z# Y. `5 vUserName string7 p4 i3 p7 {% q" X, |. O
' c1 \" S$ ]. j1 X" f! \# Q
}0 \% f. b: a% Z9 e

+ |# ~. Z1 e/ s' G9 |func main() {
/ w; V2 Z; s: ?3 z1 |9 W1 l, T# d. r% C. X% ]4 M6 p
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")  P  b4 O. }! e% `1 U$ L  R
2 e0 G/ q+ e) G5 E# p: L4 l$ h
if err != nil {
/ d; d. b3 i6 t; A/ |
2 A/ R5 }5 s& c# @  e% x( C$ Xlog.Fatal(err)1 u5 k6 b1 G0 D; A3 [7 ?
5 e3 F! D2 [2 M. P
return nil/ i3 I1 O( b3 g/ j( k( M! v% X
' A0 _! u+ R2 j1 l! Z
}
* J" v( T& L, a( O8 ~5 _5 Q' i. _3 M2 b8 Q
user := User{}
! Z5 |% L4 C6 t  z8 E& g( F0 j
stmt := db.Query("SELECT * FROM user")! S; @( a8 k1 K. M) `

4 J+ V" \1 N8 z2 Y; dfor rows.Next() {# I, x: g1 t8 B" D7 ?

) d$ h/ E2 P5 ?* lrows.Scan(&user.UserName)2 W6 X  a: l4 O6 Z7 `7 P) |
$ ]( z5 X, w0 g
fmt.Println(user.UserName)# H  ]2 \" V: y# _% g3 R
, e) @2 k, @  n9 \% W  H
}
( i, k8 N! ?) o" @2 ~5 d
6 @0 r" H& D4 ~% H& B$ mstmt.Close()' [3 S$ F" u" o. u: C- r: W
& o' y" d, L8 T( |+ P& x
}
! y3 x7 g2 Y* g" R' j# }. D1 G2 m, C5 E2 ~9 A/ _' u' }- C
三、总结5 O% q3 |4 D$ u

0 q  w+ L; o# _/ l7 k, g% d8 h对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) d6 E" l- K- f5 P( I
9 _; m- u, Y) K  q# x0 _) i
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
( i' t* ]2 l, z4 @) i. X8 @# r, H, V7 A" w
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。( b1 F) E; x" E  @& t/ J
7 }/ t; {+ S7 c# d1 v7 N& _  m
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。7 i5 @, L* A+ _- x0 u0 z
————————————————
3 _  ~  o4 D2 t; h8 n; U版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 L! n$ z# F; s, h4 f
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& l0 c: E9 x5 L

; [* U$ u) M4 Q: D# c; }$ k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 15:02 , Processed in 0.128921 second(s), 20 queries .

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