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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。( C* d8 W3 W5 B& N
! c# u* C' M/ c3 Q
一、数据插入 - INSERT/ j0 e7 Z/ ?6 v( v+ t3 Y2 {0 f2 T; t
/ G3 U$ h, D/ l+ ]4 p
1.1 : DLang 插入数据
* B- O( [/ i* E/ }7 o: Q, ~" w) P
$ ~" p$ G  t5 H/ T: J0 yimport std.stdio;) R- U" G7 J! U0 D+ C

: {* @8 b' [3 timport hunt.database;: A" s# }* h# [6 t* x. {

! F* U1 v5 x- ?* Dvoid main()
5 E6 n% [5 O7 P( ~/ e% \( a, ^' a/ g( I
{+ g. D& e# a0 a2 P/ v6 D

* M) D5 Y3 \! \% x, N' o3 A8 oauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
. X0 Z) H% g3 V" m3 I2 r3 e: N2 F& N( s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
$ S4 |7 p' p) N1 G7 W0 L4 j: ?% A5 h" \
// 打印插入数量
( _- F7 Z$ N: z, M* n* i' a% i0 u. R& g7 _) i7 o( a
writeln(result);
  R$ C" x; u- n$ r( ?9 g; E$ D6 t$ o( [7 d
db.close();$ G! C( f* ]$ L1 n1 b& h
1 U% `6 U  a7 C( y% d
}
3 u8 q- w* ]* _1 a
; V/ R* v9 R5 Z7 \5 g& j1.2 : Rust 插入数据
- o' a: s) z& [7 M7 `( t" l
& U& Z% _5 j  B* B; B; J. [extern crate postgres;7 Q$ t. L3 B7 e8 Q. b

" N" a5 O3 d- o* ause postgres::{Connection, SslMode};  ~1 u/ X3 e) |/ L1 Q" n- c
/ r0 N3 R! z1 p9 v+ |9 y1 \
fn main() {
  |' {. P/ h" S/ }* K
, v1 B/ }3 W* m" Blet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();9 N& }/ R& O, p( b+ `; _- K
( P0 R* ^0 C) g
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();6 a. X& h& U: z1 C( L- l  ^% P
4 @! c; `3 h3 u0 @8 n2 k
}
1 d) r$ E7 ~4 ]: O/ h
$ J; \/ \* v- i2 {& r+ \8 _+ X1.3 : Golang 插入数据
1 C# \- M! Z! Z$ w$ |6 B0 v
+ k) e/ F) `3 z7 ?2 ^% o+ Limport (
0 d% f+ r$ R$ }. G* \- W( v% q  ~+ N% V- s( g/ G% {
"database/sql"
! Q  L* h, U( z9 j. `7 |; }
+ T& A  G2 x3 f0 k7 Q: B. f6 K"fmt"2 C8 I+ o0 T+ [6 l' v7 R) `

0 ?! g6 H* X* |_ "github.com/lib/pq"
. m) J$ ?; B2 J$ U5 j) X7 x  P% v; V: r3 E7 u2 k0 F: W
"time"
/ c6 Q/ U# P1 ^( W, M7 m4 l) x
" P; S# o0 d& \" Q8 i"log"
: s4 Z8 z  v1 v. \/ N6 O4 W
& ^7 Q, G1 E: F2 Y7 p7 l* v5 Q+ |; s). Z) o$ y* n) h7 ?& H5 g4 |' U! n- v
9 L, C; `& u, S9 R" k6 R# n% L
func main() {% {- x, e( z8 T4 e

9 N' R1 o' x) I! {& r2 n  B2 `, Hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 H1 d. m. D# X- K6 Q: y) X' b5 [

; l9 _3 G, E( v/ G: y: cif err != nil {) B+ v3 D6 h$ ]9 S7 N  s5 L! x

2 N7 b* E4 s/ [0 C& t! ]) vlog.Fatal(err)
) ?3 ]3 L* r9 B: K3 G
8 h4 ~" z9 z) O. v& ?3 {return nil
' w/ ]. g$ K' b" g' E6 S
) u  F4 A( v; J) h* {}6 j* o$ u7 r$ q; g

, {6 _; [7 X. q4 Tstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")"), M8 x' m8 Z; }- }+ V
* p: c+ ~( `  q/ g
stmt.Exec()
5 V9 C; O4 m/ u) A" w& }/ ?
  F0 K9 m5 Y* h; {; T+ gstmt.Close()* M. u& s5 M, G4 g" u

8 }7 p/ v7 Q" p8 r) ^& O; t/ ^5 T}; {, x' w6 e: a6 s6 U+ Y

" A* s4 c& ?) B二、数据查询 - SELECT
& J6 g3 b- g: q, z
8 s, {* R1 J0 ~9 {7 K3 V! A( B$ l5 i2.1 : DLang 查询数据
1 v- }. f6 ?% P1 c  G2 q' k& i# z- Q! q3 c7 A* x2 `
import std.stdio;# G% q  x% d( k% T( R1 i9 t
7 H" a7 V, m2 B; X
import hunt.database;
+ z* O- Y' C& P2 B2 r, ~' \+ t6 ~7 }; e# V6 g- ~+ j6 A0 y
void main()
3 I3 Q6 m5 s. A2 x6 i: ]+ w6 w8 n6 H4 e$ c2 C5 _, c
{2 I' K1 L8 }. s$ g' R

. `, H5 b/ H$ T; aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 d2 i0 z0 c1 t! h1 j

: `3 M7 R: C; M2 dforeach(row; db.query("SELECT * FROM user LIMIT 10"))
" v* o9 n7 p  _9 M4 M- K" }" w4 b, M: k* L- n! b1 _) l
{
! T. \2 ^' O2 b/ |/ f( s! r" ], a2 m% u4 o
writeln(row["username"]);7 ]! P/ u5 n2 q
+ W( W. ]6 n2 a/ O  @
}
+ H; P$ D5 |* i4 U0 S% I5 \" l" Q. {
db.close();
9 ?- E4 ?. \" ?! K# p$ h) z8 J- b: e  }/ b0 f$ \
}
( J: V" Q5 V! \5 k- v
3 [1 V! e0 U" j9 }; s4 d2.2 : Rust 查询数据
( i/ w1 Z$ S, J2 k: A* C$ C
4 y* T1 B+ t4 r- s8 T8 I( V; ?extern crate postgres;
: v" Y# W; {6 F) G9 j) i' J& l6 v) t/ g% @7 N$ U
use postgres::{Connection, SslMode};/ Q# S2 v- G0 }% V
& f+ _, M" v& |! _3 K4 ]' b% b
fn main() {; Q1 p, a# ?4 _; ]- L" H6 o) a
3 [$ b8 q, ~, |8 x
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 T5 ^2 f9 _$ k3 k1 R! c1 P* w  F: M- e; E- p5 f) N0 e
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
# u; F2 W% G0 B
3 [4 B7 E6 P( l! g, Uprintln!("Found person {}", row.get(0));
( r) s- U7 D$ e+ n' A" X/ }( _9 m
$ D! u$ g4 F! o! v- q}
8 a# ~5 {0 ^% p6 j5 o& A6 h& Y# i! B
0 F4 J7 _( }: o3 F; I% @9 K: u" Z# e. x}% D8 t9 E, T- n% ~9 |. L4 e

2 M5 Q6 f2 l& h2.3 : Golang 查询数据
5 S& u2 w- `! A  W( `" N( L  T- L! D5 I$ R
import (* Z, ]! x3 v/ i! v8 i% i
1 `4 j! Y0 K4 ^1 y
"database/sql"5 P8 N+ \" Y6 h5 f6 a7 P
0 _3 ?/ m( L1 D- B
"fmt"
9 j$ H( O3 o* `! N* D* ~3 n( s; i3 n  j+ B5 c
_ "github.com/lib/pq"- A$ j/ w' H: {/ I4 W

- m, ^8 o) ]. N. s* e2 j"time"
& w/ Q# s( s: q) Q6 e5 v) ?4 E( M, X' ]5 c+ e' S: r: J1 d
"log", {2 ?. i3 h# O* F+ `/ r) n9 J# V' G
  o+ _# |* j# B8 _. X- G
)5 `9 k  N" S+ z+ m5 @0 Q# z, J
, i& M1 ]. F# e
type User struct {0 j+ [+ w9 d" m, A& J

+ N- C6 B2 \. v* r0 uUserName string: t4 f& Z% u2 x, I& W2 y

, G4 P- l, B2 q9 S" D/ e# F+ t* _}6 ^4 G# ~: Z. u3 m3 a' H5 x8 i
- ]* Q8 F) l' B# f: l7 A
func main() {
: o' `' Q3 j8 s  t) K' U! }& e0 B+ w9 c4 A
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
8 A8 ^. P9 ^; I* c* q! r# N; \! u% {0 F) `: v# @2 _
if err != nil {
6 H4 q& h  _5 M6 {' ]1 N! v8 y/ C. |/ i* M; F% C, S
log.Fatal(err)
1 P1 C$ V8 O! {
* P+ k7 u# Q6 I' j7 ^' Sreturn nil! j- M- N4 R+ L' H
5 d2 L/ `% B3 g# m$ L
}
8 |/ z% U. p+ Q
2 m: V- ^8 C  @user := User{}. v+ g, R' x' e7 M* A6 F3 E7 E1 W

' H# `: o* g* g8 R0 j3 N6 j' q% qstmt := db.Query("SELECT * FROM user")1 F$ j) V  _: K9 J- V

8 D) L, @( a' A# W# Z2 lfor rows.Next() {
; D8 q: s6 f/ e! J( Z+ p
& j) T9 i% g7 grows.Scan(&user.UserName)
9 V2 w( D6 }0 d' h) t7 G
% {! m6 X7 J0 [" o: [, Wfmt.Println(user.UserName)
4 }6 o' T; |2 f# N9 X8 |+ p9 j
) l( \$ L; q5 _& S$ \}
- `* A; T5 n  A2 P9 S  N" G1 e1 K  |
stmt.Close()8 h2 L6 K$ `/ K* j

6 W; t" N. C" L9 q5 ^' Q}: _- s$ m% @9 k9 ?$ B
) t3 X; ^( h3 C4 p3 r
三、总结
8 o4 s9 k4 T& P$ Z
# [: `" Y) y% ]# a) U6 W4 _2 F; }2 w" o对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。6 D9 z2 t3 F( L
, ^0 X8 t8 |  N  A4 ~2 [
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
) G6 e5 a3 o3 g; k% D( H
, L/ Y: a% y" G' B: |在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
7 ^1 R# r  S: L5 T0 d' Y' f" \
& c* z% r: ]) X, p7 x4 |/ \! X总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。* J0 Y- S4 O4 S1 _6 p2 D
————————————————
: R( x% g, y+ D+ P, ^版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* s; l, V9 P/ T; n& K! V原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961( l1 M  ~9 _# S1 E4 B: L
9 o$ m- }" `3 e; `* t) r* o1 g) C) m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:12 , Processed in 0.057202 second(s), 19 queries .

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