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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
3 @  T4 o, x( o4 E5 V$ `5 b" y6 K) S) n0 p
一、数据插入 - INSERT
0 q# ]" n& k* s# R- [0 C
, O& z* [2 P7 o2 |+ D/ S6 [2 Q  P1.1 : DLang 插入数据
7 E6 A% [" C6 |6 p4 a
2 b& v7 s+ ]0 D5 }! u) yimport std.stdio;. r3 T& W- @* j* @  e7 n* D: H

9 H+ q3 d% s* ?% g  ^# V5 Zimport hunt.database;
/ ~' s% P0 A/ r' [- P8 q0 P4 Y5 K" o7 o  }. w2 @
void main()6 @' x) i& h8 b* ?6 l2 G

5 s; e( w' c9 _" i) J* E) |{0 V9 O- ~, X, N/ N% \

1 }* H3 R( ^( T! `7 I% Wauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ `- D& v* d' B5 d; D0 i
! H9 r9 A$ J* p1 F! H: z
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);# |- a2 T0 f% ^+ I! e6 t
8 j4 \; N$ q' ?! G4 }2 b
// 打印插入数量6 D# h! Q/ D: b; O3 g
0 y) ^* U/ j: Z& O
writeln(result);2 F# t. K- O8 N2 j: Y

* y: s. N5 r* H  g3 |* Ydb.close();
+ c; r: H5 [* B5 o
) \0 f3 N/ v8 ^& I2 {+ `) `/ L}
- L* N1 N9 u7 T5 G2 X3 l! }- ?$ D' e# t/ P/ \) N0 X
1.2 : Rust 插入数据% j- a/ A, y, Q& Q1 V# ~) T

  U; T' f0 |! q; Xextern crate postgres;" r. H& p1 [) V; a; H* J0 _3 B

6 t- u5 l3 I- i/ L/ X" `use postgres::{Connection, SslMode};
/ K9 }5 [3 `, f8 n  e8 |! a
( p+ t6 S7 J: B1 u% h8 ofn main() {
4 ^. x5 @& h) ^6 Y0 s  {- L
$ @1 |' B% L: w9 s8 o/ }4 Plet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' P0 L" Y# c' q5 {$ ?1 ~4 e/ m+ P* c; c6 `* ~% D5 g/ A
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
0 ?0 l' G" m/ F5 ~$ w1 V
6 [( C4 v! J: X1 l8 S& {8 ]! g}
1 S6 v1 J& U* f1 r& t% R* P/ a! M/ ~) `: t
1.3 : Golang 插入数据' t/ s% s0 ?( `$ n( l

+ j9 S7 K6 l- x1 g. \5 Rimport (
0 g# C8 ]3 P6 a0 E% ]
# f& N8 s- [! E7 D/ d! _"database/sql"$ ^6 H! R+ M" f% |& W" f1 F( ]

: M6 K1 k% N( C& u"fmt"
* V7 e+ o7 N5 c8 U$ h; B; s0 V3 J7 [! Q" X# r7 D$ G- L
_ "github.com/lib/pq"
% g" b5 P2 Z4 a( k. P: _+ y* \+ s$ {+ c' `. ?6 F% v8 t9 ?
"time"
, ~' U1 o/ ^# T* D+ V4 ~8 h. o5 f
2 B9 s5 Q* ^! {"log"
/ K7 x& Z, `" U- I
) c% Q( M$ T% z8 Y/ |1 ]8 h& S)
% }+ ^8 {, i$ y$ r2 e' w, o5 ~+ a8 q
  u  N9 P% W# W  f! @8 Vfunc main() {
: v4 @. p9 \) ^' K% P0 \
4 C3 g! E6 y, [! F9 [db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
+ S" r; r9 r: z" G
+ F' q% I$ c% p' }! ?if err != nil {
& ~  n2 N+ r* N
* r4 G. h) _+ a8 c. Clog.Fatal(err)' K1 u( u5 i7 m# w/ O( L4 _7 N

" M0 Z7 y3 y( y2 }* I; mreturn nil( c) ^2 D  p" G6 x8 E

7 h$ p! c' X+ o6 x* U2 v}# f/ y/ J8 _( e! i$ D! b
0 n( u" M" ?) y$ }/ C
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")6 N; m: @/ K6 k" H

- [+ J* f- h; n7 T4 ^- z: h. b, ostmt.Exec()
3 Y1 S$ {2 d, d- T7 r
$ v% I" P4 m% Istmt.Close()" D7 S! Q$ X9 @$ m% O( |5 Z6 o

% u7 }4 e1 {. g}; l7 T% V: x7 e( [9 G' p' g

+ y3 Y( D) Z3 {9 E% S3 F! h! r二、数据查询 - SELECT
( o+ `+ L1 M7 N" c5 _  b+ u: a8 q$ B/ D6 F" N0 Z3 X: A
2.1 : DLang 查询数据
9 `2 |- C/ s9 W' a0 ~; f1 r# _2 S: e
" D7 H1 {+ N+ n! R( a/ Zimport std.stdio;$ @- Y5 r; H' P

" ]: }: k$ y! a# a7 a; h+ Qimport hunt.database;: f% W* h# E; Y3 Q) S& |! B& s7 ^

1 ], R9 s/ C4 y, i0 k: Jvoid main()
# E; C, n, w8 f+ Z& T* D9 ]8 T4 f# G& Y3 L( a& E
{( A$ T% [2 H  L: C% e

4 V# W, T( Z2 Y# ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 Q% x5 R- J9 e8 f/ @# ]2 o

7 x' i+ b# m( b( B3 x7 Lforeach(row; db.query("SELECT * FROM user LIMIT 10"))
. w% q- R0 {6 {2 g
  Q. j: V% ]& Y{
/ ^1 @! j! u  g) p; R
+ I4 {/ H# s. I, X8 m( l0 \writeln(row["username"]);  e* h* H( b; f: C, C

! T& E7 {3 g; M/ ?}
4 Z7 ]9 p% B+ b
3 N* K& q7 J1 x4 C$ jdb.close();1 b5 R" z3 n  T% H3 C  W2 N3 Y
3 x5 U/ g( z# @
}' }$ o* M# H8 p3 D: _# I+ ~) m7 E

1 |9 m  x$ a# m7 X2.2 : Rust 查询数据- n. B8 f# ~7 X/ t  N5 h3 L
( V0 h& q4 {7 ]+ g: W1 D  ~
extern crate postgres;- b+ ~( W; e2 o8 [, [( H! Y1 z. ~/ @
; j" w8 v, n7 ]9 C9 }# ^  C1 ~
use postgres::{Connection, SslMode};
. ^( f( |; g1 e, S- {
% `0 v8 P2 g; S8 d& ]$ G6 J  qfn main() {
  ^% |5 s& h: U1 A
8 f' @$ A0 C6 n/ j5 b' K3 Z% Rlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 j7 Y+ T& P( h+ Z& w$ q
* M+ ]2 B* O( @3 Q( I. v. hfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
+ m' ^5 A- X$ j$ g
/ f8 p  N. @5 e& `+ a5 j! |println!("Found person {}", row.get(0));
6 A* i9 [0 T+ w! w
/ r0 @3 I/ r/ \4 M; m1 Y9 `% G5 f}0 C) ]# w" J8 a) S" J, b9 \
9 g$ c, g# L+ V- p* W3 a
}
$ ^6 `' [; y+ g8 A5 W/ T, _; H5 {* @/ ^# O, I
2.3 : Golang 查询数据
1 `& M4 y2 S) N! A
8 X4 D: m  R7 s5 }6 Himport (
# t5 u/ s$ w  @+ M9 [3 e1 f' G$ O) q- m1 W# [5 ]/ O
"database/sql"% s- F" u( j$ r7 F1 }. q
' H! F8 `! ^4 p! K- n4 ~  E
"fmt"
8 o, u  f% J% r8 z) G" B- U
. }1 [1 x/ D' R/ f_ "github.com/lib/pq"$ G7 {4 m% }! `

. y( C8 e. a9 H4 M  h  z"time"( s* l4 u4 ~+ L8 d$ h, ~! f
% ?, \$ ?1 _3 u: t& B1 w: P
"log"
& Z7 Y2 B  x1 M$ U3 P. j0 P. ^4 u; m  F1 x7 y6 P
)- v& G; M1 ~% _5 {$ ^7 K' H

! Q# l/ r! @! c8 a6 }4 G* Y  R9 ?0 utype User struct {
( H! k9 ~: T' j9 G3 Z) u1 g  a9 z5 O+ J- V
UserName string
. T- _3 U7 j* J6 i/ S9 O3 v5 w  J8 }/ ]: k) u: w7 K% f4 S
}" T! N. X2 }9 s) O
1 P. g! a! f& V
func main() {
6 V- @+ Z7 w6 k4 |. ?, ^# A- S6 ~
! H! |, U7 \$ mdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( Q% K0 H  S7 d, Q  T) ^
7 G( B4 N- |1 |
if err != nil {# |: Y* R0 \4 |' A0 x
2 J* L7 k6 O0 t! `, ~' W
log.Fatal(err)
: `" M0 O8 B" g# P" V, Q% E, T% W9 j* ~9 j# v5 b
return nil: C) \8 b, b/ t
$ |3 E" b3 u3 y; I
}
/ p' o; f1 F) a- f2 k
  I& H5 h  ]5 G: Vuser := User{}+ F) d- B1 |3 `+ m
8 Y  U) r# K) H2 j" ~4 f
stmt := db.Query("SELECT * FROM user")
- ?* j2 p3 O5 @! ^& H. M6 t! ^$ E! [' |1 |( P4 p- [% g" H
for rows.Next() {
) a) x7 a* Q8 [# K- }
! m0 Q% {- f( m$ Orows.Scan(&user.UserName)- h7 g( Y9 P7 \" q' C
5 M+ s9 l& B2 ]
fmt.Println(user.UserName). B% d' j; A1 x' R" g, m" A

( E6 E. U" d; ^% T}. n$ q: r4 U) V. n2 d: l

! C! t0 m4 z( J) w6 @" kstmt.Close()
7 ~' O! i$ K  T# P  ^
/ _& O- o( v2 ?7 O( m}) o/ E3 P/ D8 m% ]: _9 a& W

5 ?8 z# K0 Z  F  S* c. E) b7 e: r三、总结
# N. Y1 w7 A8 \, r  q7 J8 V3 n. s0 s& ]- C* L: F" M
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。" o% }" @$ p8 r0 c+ w+ T& B
4 S! g. ~# q9 B8 D2 j2 ^0 |
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)0 H, T( O& D5 i: t1 n& f

& E! E6 ], X6 u* S6 v8 q在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
+ E, F# x! I7 P9 r" ^9 E6 a( C
7 v% n/ A1 N% F) n3 N( H) w7 X总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) y! H$ S, S. W$ U————————————————
- P8 c8 w% F3 J/ C版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 }9 `2 ]1 p; ]8 o* a. t原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
" {1 X7 Q6 k1 Z6 ?6 C. P4 }% O& F) H. v( i5 W0 u* T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 13:02 , Processed in 0.050874 second(s), 19 queries .

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