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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。" `+ i" W4 X9 A, X2 \) n0 W
( _* a/ |- w, s# h  Q+ p
一、数据插入 - INSERT
& y2 A/ v% R% Q+ y* Y! V5 M% S
8 R; j( K  b4 k# f: }( ]2 w& ^  }1.1 : DLang 插入数据# I7 a5 ]/ q- i) d5 f: j6 B! [
% J; `& p' |& Y) n
import std.stdio;
* u7 |1 k6 N0 n, t' H  G1 Z/ i4 S- G5 @: t! A+ Y; \  `" A
import hunt.database;/ ~8 J5 ^( N  [+ B5 G" d

. p9 k0 r. ^# q$ T# t( yvoid main()
) _+ [0 |; B; U6 P
7 j9 C9 l1 l( q- a2 z$ V3 U{
2 x, K& U9 p( a5 x- O2 m
8 F! q* j, F* i: S3 c) Qauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ F4 e. u5 R% H) j* t6 B
+ o' J; f" {- o9 n$ O+ Tint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
8 k( `: H7 P3 V
! i0 Y  ]7 ~- J" @/ d// 打印插入数量
2 ~% ?* D& X. a. D) `7 S) N& [; b; I+ k' s0 l
writeln(result);4 ~; R& |8 j8 S! l2 p+ I; K  E

0 x! P; p. |0 p5 f% wdb.close();
. D& B1 c& }% `( }" ]8 r$ [7 Z' X
}
. x  I% F: q: D, B! `2 w+ D; u! s- j( S; N- g3 s" ~3 |6 h
1.2 : Rust 插入数据
  P7 F7 g1 M# f2 P0 D
% H8 v  g3 p4 m. o! Q2 Mextern crate postgres;
4 o8 @& G0 z+ t
8 _5 U" N& X3 I6 e% m) Cuse postgres::{Connection, SslMode};
8 J  Y3 D+ o$ ^1 o5 Y% |9 [/ `* n# w7 ~6 Y& q
fn main() {* r2 w9 Y5 c& f. v8 W1 b

( s2 a5 ?' }$ E+ |6 [let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
! a: J! P7 \! E; b% ]. b: G2 C% d% I3 \- R1 L* l$ R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" _4 e9 S0 |8 E; y
# @* Q! D" |. T" ~( ?" T
}
0 e) @$ k" m" }- P; b( N8 o
( |2 H1 g: Q/ y9 O# G& w1.3 : Golang 插入数据
) ~: `$ R* \8 ^- Z( H( `/ H# I. c
+ I+ g( ~) M$ i- e4 N. n/ e& himport (# v7 l4 X2 ^1 g6 ^& o  ]

$ I% b. ^  B) J/ @" v1 f* _1 T"database/sql"
6 {- \! D8 [5 J9 U  R, k# c( S2 c4 Z' w0 f3 N
"fmt"
& {8 j: `- p1 `( J( P' m( A; h6 L- k2 g4 P* f6 f! l5 [
_ "github.com/lib/pq"
& n6 @2 d9 z4 m1 _/ B0 j( e9 _- G* B$ W6 q, d% z
"time"( B3 I8 e5 Z, i: `" l3 }

* |! m5 U7 U# h( p+ e6 C* N: w"log"
$ @; k3 n" b/ r, C. M- P) n6 Q1 k. |  o) f7 X0 B5 C
)
5 Z$ N, }8 p+ }1 k3 ~; x: a. X" `' j$ ?- Q3 X
func main() {, t" @% x/ N0 e2 q5 X, P
( M5 J  e5 I- s6 s( T6 a
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
# n* L9 E8 }& j/ R0 k, y
* ?5 z2 V% i  x! X, Oif err != nil {
8 ]3 N9 Q' O# f: ?% s: D0 b4 {3 J0 }5 f  Z
log.Fatal(err)
2 G- j; x0 Z- ]" _
( _$ j% M; y; M1 b6 ]/ ]' P6 R9 Xreturn nil1 D! [1 z5 n5 c+ `1 n/ b

: g4 L6 y/ K4 I}
0 X7 S6 B! B( v  J& O# l
# }4 m6 ]" h, W8 j% n) Kstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
4 E& K( t' M  l/ T$ D- @1 f
$ v$ M! F0 q3 B) ~) }stmt.Exec()
0 j# M, w1 R8 Z
. @; x5 G8 H0 C; `& gstmt.Close()( Z6 e  b. r+ I2 t; O

; ]4 j& B6 V  `. \. W' @}- O( E& A+ ?- D/ ]
7 m  t7 N5 g- B- F2 i; Q  b4 U
二、数据查询 - SELECT
5 B! V2 z( D( n7 l! ^7 n4 w$ j1 t* D5 j0 Y
2.1 : DLang 查询数据5 r: h8 t% O# i2 Z# {

- e& u0 @4 d! h8 kimport std.stdio;- }1 |* y  U) V1 i4 P

0 ~) E- ]# E3 e7 w1 u+ L1 |5 _8 Z7 `2 nimport hunt.database;
6 O2 ^+ D8 ]# r2 e% J2 Q4 d7 k$ M
3 f' R( f- V. g8 G$ o6 Pvoid main()
( H7 j( g. m& n  L5 D" {1 y6 ^  a& c5 c! o
{
9 h$ g8 f6 [+ {. N/ N& ?, B% |' p6 O
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 {' x# ]0 a% q8 s. ~4 T" P+ h3 D+ ?& G7 Q, v2 g- {3 e
foreach(row; db.query("SELECT * FROM user LIMIT 10"))/ E4 _! @- q: U% ~/ w

# \2 E5 W$ p( u5 g3 f{
# |; r# ^2 S& S  S; B, h
9 @' o; W- _/ `0 vwriteln(row["username"]);
! j5 c  j9 M1 f9 Q
: s6 y+ q1 N/ x  [& a: q/ e}
$ D# Z4 U, z2 Q& x0 {4 ]
! x1 B/ C- D0 m/ w9 Ddb.close();; I, f1 w6 C# I+ I' A* h1 q4 U
2 c# [" Z! g  s3 x& Y- j
}
0 u3 P9 i7 J* w6 m
0 x+ j8 }. c9 e6 \7 n2.2 : Rust 查询数据$ X- J( J* i. F' ~0 i& e$ Q5 X
& X# l/ q8 O3 i7 }$ o( L2 d' W+ @
extern crate postgres;
6 s% d! l5 z7 J. o$ u2 I7 r$ m  i1 e0 s. a( m7 Z1 h3 R
use postgres::{Connection, SslMode};
, a3 Q2 [" f5 p- G: G# a3 r
4 T: c" E5 h. s+ A; Tfn main() {; g4 ?" u, S( e0 j2 D9 J# L- f
# S  G( f# D6 k; f! B
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();2 ?; d; T/ a% L; S4 Z
4 k% P  b) w$ V
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
/ `  ]  I6 ?8 f1 ]1 |2 f6 e6 \. S3 L  p4 x; K; D
println!("Found person {}", row.get(0));
1 Z" K( Q  [: y5 B( y4 d
; h5 j* F5 W8 q2 e6 l! @5 i}6 ^. d: p& Q9 J
" e# ~& R; j9 g9 O: }
}
" S0 y  V( |8 Y0 g: S
; m- S7 d) c4 H2.3 : Golang 查询数据' e2 \! E4 A: U% a( d2 Y) c! z
! c5 D. x* P) J# u3 |
import (3 W) @9 y1 F$ K- Q

4 h$ O# \6 J/ @5 k# j+ H9 q; D"database/sql"! c8 ^! G# e/ ?4 C! B6 K  f9 X8 M

' V( d6 q, a% G4 i4 @"fmt"
4 i) E" v' t' K) R8 T. j* |
8 P/ A: @2 g6 I. A! x' p_ "github.com/lib/pq"
3 b. d, D. ~. W3 ^; z1 w
# T; m9 {4 v. \7 a* n"time"1 m; h: G1 V5 ^. f
& J# w' R+ l3 P) @
"log"
0 @) `1 n$ Z1 P- _
! B6 J: @# z- G; c+ W)" ?% B0 G' E5 Z

) F9 E; S! P% M: D1 M, X9 o1 Jtype User struct {
' J, I1 T3 _$ k5 F1 _  j, j, _# I- U0 f' K; @) U
UserName string
2 D+ S" J' k* d! t( A4 |
" Y' @9 ]2 d, i$ O}
; i& V( P& _& ?; l  t. ?' J
0 [- C! l( B* \6 \8 Kfunc main() {
+ w  N/ X! A7 T0 Z8 ]8 S& U
: m' @3 I3 ^& u- [+ U1 cdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! z* y2 K9 z8 u* x) n, w/ Z: G& n; G2 D1 M% Q1 H
if err != nil {. N5 @( E. v5 }* i; L1 M3 `

/ U2 W+ w/ U+ ~9 S3 @( N# |2 J% xlog.Fatal(err)5 A: z  ^, l/ k6 i

* V3 u  M+ ?- Y# greturn nil
, _& S* l5 x( P) W, K' D9 ?& {. U
  A! K& m6 m' o+ _}
3 t+ j( k& N) B
7 t2 n3 ~) a6 w- I3 k4 t; Uuser := User{}: o2 f' [3 C7 U

6 U5 O8 m4 Y; l6 e7 j' j) Gstmt := db.Query("SELECT * FROM user")3 d' h3 c- W5 o

. p. ~- g1 E# h) e  Q2 H7 Efor rows.Next() {' t  T6 G1 a- E0 O0 o
3 J8 L2 s5 |2 b- I  A9 R
rows.Scan(&user.UserName)2 s' g0 ~: x' t! n  O% C5 S

$ @  l3 ^% z0 N6 |" x2 w) lfmt.Println(user.UserName)1 h; E/ ^9 q% U' Z. V# \  Z

( ~6 w* L8 e: g6 H# o1 n}6 I; C3 L  X) H3 ^8 \& q  O# o% ~
3 w1 s6 G9 ]9 B( r2 Z2 m9 G
stmt.Close()- E: g+ V" H2 [9 z1 ?" F
! X4 K7 |3 b. G4 ?3 \
}
' M' K( C0 z( T3 s9 ~
) k/ T7 A5 v) {$ R7 E三、总结
; c# N3 ?7 ?* R8 L! ?' D5 c7 f6 I% ^$ S5 M& q+ _# Q) `; C+ F% S
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
  k% }1 p9 f' R8 S. C
- k% }8 Z' |8 q/ P5 N  ]这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)# y4 O5 ]* A2 E6 L
- [: C/ E/ _" V3 }- _) A& I; Q
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
) g, W2 w& P" W% X: a) T
, v" g3 k9 J; U" h% a7 I* Z总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) ^) f6 @7 T  a2 Y6 \————————————————5 }' b/ n  F; F9 x: X
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 A# Z+ L$ b- v: C7 U原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
  h* m9 A0 g+ Z
6 `; z+ ~9 ~& e" ]/ p" |6 D* S9 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 22:48 , Processed in 0.066053 second(s), 21 queries .

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