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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。6 X6 p! x1 Z. U, n

4 z! ]- }  y" o  ~一、数据插入 - INSERT- C4 K* R6 X1 t- v
; h  m3 b. S7 {" R# l7 G
1.1 : DLang 插入数据
3 T, h  Q1 h! J# ], T" R! M" Y* {
8 d' Z$ |! R4 j3 oimport std.stdio;( b8 k' Q/ c$ h
3 w# R! p4 F/ }- a
import hunt.database;4 b! y6 \" R6 K& o( F7 f+ T* o( G
- ~6 k6 A7 ]# V
void main()- E: \* r6 ~3 f3 Q8 C6 m( x

! Z0 H5 v0 P8 O$ J  j{) d3 [9 g6 M$ x# R  ?

, g/ a" D2 u" y4 `' ?auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
* P8 o* P4 E' I* R' m# G
! x# M3 W' P7 d4 j/ k5 L' ^int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
/ B  J$ N$ |) H* y
; s% l; }, w; Y# E! ]  p/ b7 S// 打印插入数量
9 [% g$ M+ |9 M; Y2 X& t, @: A" Q5 r" d3 t( s
writeln(result);
1 g$ q: S- l/ ?) S5 m2 z2 i: K( Y
! X3 |7 d2 A- {% m5 V0 Xdb.close();- k& l& d+ T) F9 y  G  Y

9 m+ z4 X* F$ b+ H3 M1 V) C9 D/ d}
) P9 A. ]1 J0 _2 r% ?- D+ O& I$ f1 I3 l: M* G' t0 w
1.2 : Rust 插入数据$ p: }7 t  j/ @; E+ G

1 L  K4 M1 E* W& A) o7 L1 }- Hextern crate postgres;
( r/ f% `; M7 k8 a( R2 a; p- ~1 i4 O3 r1 r5 h9 K
use postgres::{Connection, SslMode};( K1 @9 P8 Z6 M9 Z7 G" n. V- s; Y( J
% F; Y1 h0 K* U% R" ~' \8 g$ o
fn main() {7 S  U) r+ G. K3 h8 b, E7 X: U; S& e

' P* Y" d  O% Glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();# d  H' Z3 g/ x* i8 H& j+ }9 ?) }

; R+ P. c4 L) [. a5 Q. y# G( dconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();  G9 |& @7 U1 |3 X( ]

+ W' H1 A# ~! E- r7 T4 v}' ^2 {, x  m- V% c* L4 t

7 b6 [3 V# o3 H2 _* v9 p8 ~1.3 : Golang 插入数据
2 H$ Y5 ?% l. U: q! k4 T& U4 S; y0 M0 O
import (/ r# q; t# T0 f9 a- F% _, S5 b

- Q( v7 n7 `8 \5 I' @"database/sql"
6 G0 y7 K& M% R$ X! k
8 m% d& i/ _6 Q0 p1 D  }; b"fmt"1 G, ^8 `! v* Y( |1 C

" h: B8 N' k0 C! Q* R. ]_ "github.com/lib/pq"
' H. [9 P1 n. R) S2 P, c# u, p; H6 F  B7 V
"time"/ ~/ A$ t1 i6 _: c9 v

$ }- \) l0 L( M5 \2 h"log"& @7 c4 \, v! y9 }, U3 `7 v* f
3 `4 K3 n1 v5 f' `$ s1 K
)3 A' {3 a5 {) u0 p+ a( V
6 v! X# e  I" N% q6 E
func main() {  {3 W( n) b4 w/ z9 \1 Z' h  i

0 x+ I4 W+ d' Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 W/ Z' b8 o" D2 X: x3 `
$ |! J* C! _5 B- ~" A1 s  ?# V
if err != nil {
# r* n5 K$ N, U
: g) f+ {5 k  h) M- t3 r' Ilog.Fatal(err)1 s, |  s5 t" f. k2 g$ n

, p9 z4 D/ s" W& v3 v' ~' creturn nil; N2 S* b8 }5 A
! Z& @, H% a: z" @: f
}
3 P' E& q. ]9 B0 T4 I0 |) T# u% T' A0 r- F, F
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
$ q: h( ?* Q/ U. ^2 k$ A; r3 e$ X
/ P* |% T6 @" Y7 }8 M9 Lstmt.Exec()
$ `1 R. L2 h0 q. U+ V( V2 B2 ?2 `! w% L
stmt.Close()
* ~) S; c8 D2 _  Z4 a  z: y/ \- k  e
}- l+ P8 Z6 S$ V- }

5 U( `# }1 |4 a/ [5 l二、数据查询 - SELECT% W$ s3 q& V. P

+ s" W2 ?- f" u3 q( N: d2.1 : DLang 查询数据0 s7 g* w( f- Y% }3 z

7 @1 R6 V' D) _: h! W+ d" E  ]import std.stdio;
1 C8 S5 r4 c$ V; n# O- X" m/ D8 W( }8 s+ @: ?2 N* P- h% L
import hunt.database;  K) E6 ^" d7 x6 A, I
9 C! r+ n3 Q$ M- f6 B5 v
void main()3 p7 d% j3 S: |% w0 s* L9 a
' |9 o2 q7 E  [: l4 Z
{
: Q9 n& ~6 Y0 v+ m
5 Y2 \0 f) j* hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");1 v8 P2 s. P; B) m) l$ J: s' _6 u( ]
: O  y6 o, n& d$ @+ J
foreach(row; db.query("SELECT * FROM user LIMIT 10"))/ M) J6 h9 Q% e6 R, U

. l6 a; W2 C' D  S* O: G7 D{
, a, s# T8 o# d- b# g2 N
7 s: n- T3 f' Q% U% b4 p9 m' gwriteln(row["username"]);8 B; c) X! u1 D

& H/ v9 i9 h4 c; b}
% J' B7 ?. T% R8 ^. ^$ X4 x
! C$ Q; r: N5 y8 J3 C, d1 c$ Odb.close();
* a, O. p: r# }6 y# i' Z: [& |1 x0 Y; d
}3 u* l% H, s4 Z( c! z/ ]! X

8 V' b/ D% M( O2 u2.2 : Rust 查询数据5 U; D3 d6 r* |- I, E, m
3 D7 n# F) q/ u6 q: U, n
extern crate postgres;
7 E" m9 C1 C$ @: i2 [" ^& W
5 V8 Q9 i4 H" {+ Luse postgres::{Connection, SslMode};) ^) m# a* w- M  W8 M) A

: j3 E0 h# x/ g& S0 gfn main() {
& E) R' l% a. n7 r5 s7 D8 M9 B6 p( A' a4 k1 u7 v" K8 `
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();; {* M3 B& X1 e5 Q) O# n# j# |6 m

  I, p1 H. e1 j! S, d5 jfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
2 L% w7 v" N9 r# G; j6 g0 N6 y* T$ B$ G# D' K6 l' Z/ ]; s% t
println!("Found person {}", row.get(0));" T& I; F0 ?# s, o: ?

/ U! z7 P7 E) F$ F}# r! u1 @$ x" }, b! W
5 e! H& q# `% J1 s9 n3 O
}# {3 R# D: ]( @) Y3 t. V) O

- L& \, N8 O- u( i) e+ P2.3 : Golang 查询数据
3 y! V2 E% ~% g  I. m* ~' p# b/ V6 _" J9 H3 c3 D" G3 N% E
import (
6 \8 ?  d$ N# A9 k, @: a
7 c. {, X5 Q. F$ m( W"database/sql"
$ z/ H% E/ o6 R+ t
3 f3 N  C" P$ q7 @2 w"fmt"; {  X) @5 C5 T: {' J

" |7 J$ G4 c+ e2 O_ "github.com/lib/pq"
& U& t# x) }: c# B7 b1 \' {& D, l
. r7 q8 C3 c3 r- B; K"time"( C) i" \4 ~# w: l

' A3 N; b( J# ~"log"& A% j; g4 c3 H$ h/ n

2 h: E  Z' i8 O)
1 F; h: k" J7 y  I: n" W
5 P; }  B# H9 ttype User struct {! b+ i+ h6 ]9 F7 N) J$ k
* j$ t' V; F3 O% l
UserName string
8 |5 ~: `' P1 G! I3 M# D3 n$ K4 c& R7 N" |, m2 Z3 `
}
  C/ I" F: b& c5 O5 J9 \7 }" L! a% ]7 j3 Z2 j
func main() {
2 l  Y5 v; d. a; C7 U! T+ ~; ^5 F: o: c4 [( \: {! D
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
0 `3 L$ L1 n( I/ u1 }4 a# _$ Q) E0 k  }+ |7 |/ B+ f) g- m
if err != nil {
5 M& ^- |/ ?2 `1 R5 M2 w2 q0 V. M9 E  v/ M) M
log.Fatal(err). C2 i* f' q$ d3 z
, B; k7 V: @* c" e2 C
return nil& f# N8 a1 I5 S' l; {, G1 S$ F

- h) ?, x4 v9 [) U% c}
; q8 F% I4 Z7 I1 t% H
+ h4 u  v" }7 o1 G4 N; t9 D( Wuser := User{}
& `% t& Z1 \& [5 ^: r; J& Z( E$ t- d7 m
stmt := db.Query("SELECT * FROM user")
' s  F# F7 Y: z3 }
7 y7 O7 X: Y$ h0 ?: P! i  O8 g% ffor rows.Next() {
! {) o! b. I4 j: k& Q
) J+ k8 w/ k: H3 m. Y0 U1 `rows.Scan(&user.UserName)
. E4 w! J5 ~' \# e, f* L) f2 y2 |. H3 O# _, E2 I# Y. D( ~0 X
fmt.Println(user.UserName)
& X* p+ _: s) {% Z: T& {1 ~* Y4 V3 H6 f* {- ~5 ~
}
8 C  K, o, W) {: @( [, D
: U& i0 Y/ X9 v, w/ w- ?stmt.Close()
4 `4 B8 `2 y- U6 p* b. l5 a% W; ~) H: @4 d5 p
}
  W" [! |5 g/ V; v' U# g1 V* N) n& C  p% h6 N" `
三、总结, \8 T8 k$ G1 Y; k/ E1 F6 b
# V5 g& m4 X3 w5 e0 I! w& ]
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
+ x2 a) z% u; q( G  g" R& P1 f1 F, f! h
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
1 }& b6 B6 l" i' U6 [4 s4 B) e/ K1 G4 p* q& E
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。3 p) o. B/ L- I6 V8 s1 ^: W1 }

2 F/ Q# G  o) @8 ~总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。6 q, S0 @; O7 F9 o- D) Z7 P
————————————————
5 Y0 b5 ^3 U, X  O3 z4 a/ M: [- ]版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" Z0 s1 V  h8 e: E
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961/ R0 D1 ]4 p) ?
$ {& R$ b; f1 y6 _, ]2 U5 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 07:04 , Processed in 0.050415 second(s), 19 queries .

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