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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
+ ^  q8 p' j1 |1 F6 z9 d- L0 [% d. Z$ u' N
一、数据插入 - INSERT, a1 I5 [; t& `

  ?5 s' T% f8 ~1 v! S4 W  z; X1.1 : DLang 插入数据
$ B% v. J2 l+ V! R0 f5 x
" X1 G6 t* R  u# mimport std.stdio;
( v' K* S1 e! m) H5 R+ s2 ?
: ?0 A# r0 i" h% C. ~2 g9 a. B5 eimport hunt.database;
( m: p9 E1 R( j6 j- n; q+ Z6 D5 D( O$ y
void main()
( s: g" K) ^* W/ }" P
* m: E, _% |" P, ^* W{
  Z& F  Y" |  z! E$ W% j3 G  P. h1 j9 ?: |! _1 C! X0 H5 w
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
- M" ?  v5 g8 G% s+ s3 A; C2 I) A' E; F! V5 _7 j% D+ N
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
% G. O. p: V" {, E0 c) |" `2 ~$ e4 |' P
// 打印插入数量  g% \. {% X1 N& I5 \1 O; K

" ?6 o$ w! z9 L8 r7 f7 mwriteln(result);" ]9 X7 m; t1 v; @

! x' i9 U" w7 F5 J- x) Z. f: u) C+ adb.close();7 Q1 [" ]5 Y- b( {# p# v0 ~9 r

0 W7 Z/ P" ~3 y- o( p0 d}
& e0 U# N) C6 M. |- }' M7 |* a
' l: I! e- L# P: ]% _1.2 : Rust 插入数据
0 m9 j- ?0 L% O( T* ^
& M/ Y  h6 A: }: l% H! Nextern crate postgres;
/ y+ {2 ?) N" z) W' J8 M3 y: x& o; |+ T7 j4 N0 ^) e$ I
use postgres::{Connection, SslMode};
) k2 Y6 j9 J. [9 M
; d% f, s8 L* H$ j9 t) p- Lfn main() {- |# N" m& U0 p  r; \
5 o/ z' n- t' _5 k0 T- B7 w
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();! N, V9 ]+ s8 x' F
0 F8 P: s% ^- L
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
) `" z# Y# P9 R# {# T+ w0 M+ ~# a6 k, ^& l9 ]1 o) U) Q
}, _  o/ k! z# B2 N

* X7 c3 A2 H* j: Q; l4 {1.3 : Golang 插入数据8 |/ |! {1 f; Y+ e, t8 P

9 ]  H5 W( L7 g$ G& \import (: {7 V+ Z: {" z1 {9 @; W

2 Y* `4 r2 J) i' R"database/sql"
* K& U# K/ R( l- |" o* b. c
8 o2 N/ G2 m; Q' A% @"fmt". V9 k  M) ?  O& B4 T$ W" [

3 B2 {3 \/ d$ a, M_ "github.com/lib/pq"
9 y9 X9 }4 K5 u$ ~, b+ l; b# m' P+ S" l( w& @
"time"7 l# k$ V, j3 ]; E
; k* F3 X0 B! g
"log"
1 T5 c$ H7 g0 ?3 R
" B; o% j; u. S6 w5 U$ e1 k' |)) ^; ^! y# ]; {) p' h0 ?

7 T: W7 T8 S% T/ ~' u1 z" d& ^func main() {
* a9 \, m2 v$ |% D1 Q/ ]0 W. G2 O5 a' G7 E* _. X0 C1 ~. e& N
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")& U% R1 ~# F1 v( R

( R" @. g/ h; Zif err != nil {
6 q3 k) a1 T4 ~' o! N; j& \, K# ]4 d# H
log.Fatal(err)- c' v" n& q/ w9 a" @+ k+ ?: C; o
7 c, |7 f4 {9 J( S9 n
return nil
- }* Z* }$ p2 z9 \; R# e
* d& ]+ J8 U/ Z1 ~% j9 S}
" _& v) X9 k' \/ D+ F) _& c
. L2 d# M7 d2 ]- u7 rstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
; J/ M- u- U; Q4 j# `1 \; `. l5 l8 v) K
stmt.Exec()5 _9 d7 D+ E; p; R- T7 j) s# ~+ l/ V

; s7 X! i- A7 ^7 }stmt.Close()$ O: z# S. m  w( K
9 I# m$ k4 W5 Q6 ~3 A' e3 D
}! `5 d: f) `+ c
6 r" ]( @/ a! H8 }
二、数据查询 - SELECT
8 X1 w: L1 A' v9 x0 w
; ^& W* D5 u% U% R! O  j2.1 : DLang 查询数据
$ p7 g; M+ p: {( S- x2 K2 M
6 G2 u9 M% J8 F- e2 ^9 Limport std.stdio;3 j" c4 K& }; @! l" l! t

" R  v! V' U8 ^/ W' vimport hunt.database;
) T9 ^% d4 p7 Q$ U! t, c: k# U0 t7 }% v8 ^- |9 s4 q' e7 d
void main()
1 p7 |7 b# r( c$ @
" z0 k2 e8 E% T. C{
7 e- A. D+ X9 p' s; T4 v1 m  m- V. z+ h
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 Z6 y! L  ^4 k" m6 G9 A$ y  M1 L
/ `) Y7 I5 Q7 R3 A2 t* |
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
$ v8 @3 Q4 y' P$ W; x0 I/ e0 o' ^' C- f4 \
{; k5 A, J3 w. |  U% N. o- {7 r" }

% |4 w' V, R0 k/ X* fwriteln(row["username"]);0 Q  Q$ v5 P' `8 P( m7 q

8 w  S$ M3 A0 O1 [$ Q}
: j. f; [8 _/ w* w; v! c# Y, v5 J+ P7 s& k  _$ f" ^  Q# L
db.close();
5 C/ @1 w9 p7 O  {' S4 R8 q7 b" ]7 z$ J  q4 ~; @) X/ O
}
, y. c% N9 Q) O# A) v3 g/ P  ^* |5 K; ^' L3 M% a# U
2.2 : Rust 查询数据
7 |7 C" b0 b& p; X( H3 u9 B( y0 Z5 `2 a) N
extern crate postgres;- {9 ^, G* b0 y  Q' j; p& V
- a6 I9 b: _, W5 k1 {( c
use postgres::{Connection, SslMode};
5 b' W7 V4 k; m! A0 I, {, C5 H
$ m/ n' Q. }9 ~) Qfn main() {
; {" ]" d6 ?: I1 D
9 r7 j9 K# e) Hlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
$ \1 ]. s! x, H% I' w7 {
8 c$ W! n) `# w2 X! B; Ifor row in &conn.query("SELECT * FROM user", &[]).unwrap();1 O+ o: ]1 t$ c. u& l4 t2 p
: O3 H/ ^" w; v, [
println!("Found person {}", row.get(0));
% U9 r9 K; [3 O) @
. _! e/ h+ J  ~* e6 X* k1 }% p}! f- Y5 |6 V! {9 k% _, M( r& V  P$ A. w

' O+ |& s" B- I$ A}* \% f' r: ?( ^( \

8 o- X, b, t5 q& Z2 |( z6 q2.3 : Golang 查询数据: e8 L! T& F9 @6 i, c
+ ]7 s* J  j* O- r2 t
import (
# g+ j/ t# T9 x% H* F" \0 M3 V" ]2 L
"database/sql"
6 A; @. t8 x5 @8 E8 P8 `8 ]" B4 D2 o, b% `# \$ ~
"fmt"* G, [' @/ k( `& G) G
" d2 G4 @+ _  r: ?9 ?7 x9 J- u# ]# G' o
_ "github.com/lib/pq"6 a* t- \6 M) D$ ~1 G& B
2 Y: O: X2 C, q( x
"time"7 z) p- H1 g2 S; _

& O! e9 a6 V" f"log"
' L! f0 |) z0 w- s3 L: Y2 Q
* D. q9 t9 e* ^/ L3 G( K6 t)
/ y7 s6 u/ M6 [: _. m# l7 F
% \3 W6 }+ f! L1 o0 H8 d8 Ptype User struct {% i0 z. ~$ B  ]. k  W; W# a/ l
, I2 t, B3 d! V8 R& R0 Y* O& a
UserName string$ v  S+ G& \% h/ m* x' X
. |* p2 d8 ?: y4 c& d6 f1 J4 L
}
  _. a+ w) S) t
( h3 ~' f2 }/ j8 w: R9 S- z+ [2 jfunc main() {
! E: ]4 t* c) v9 m) r0 R  e
; N5 t' y4 V2 R. ?db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")2 o4 c% P# u' Q3 |1 g" c2 F! O. }
8 {, [" A6 q# E  a
if err != nil {: @  _; i" Z9 i" `3 u) Q" i0 v
  p; _5 W. M# x" b5 Z3 e
log.Fatal(err)
5 W" u8 I, Z8 e! U
3 t7 P, L+ E" t0 a1 I8 Nreturn nil
* D8 T0 t, q$ e2 |4 T( B+ U: `; ?8 T
}4 m( i$ m5 Y& d# R% S, x2 r2 V' f

4 D. Y3 _! D  Q1 }, k  L% l6 w& b! ?user := User{}
3 P7 }$ d! P5 |4 E7 m3 V% B& U  j. m% m
stmt := db.Query("SELECT * FROM user")9 Y% C. E6 z1 J& k

( z: t3 a% B, N. yfor rows.Next() {
. B$ v+ w' \$ u$ B' v% b' h( F% L2 q/ s
rows.Scan(&user.UserName). U2 m, a& r' _$ L% \+ p

1 f4 M$ I# y7 g+ H7 Bfmt.Println(user.UserName)
2 V2 _1 W' f% e) o+ z  Z& C3 T
( s) r4 \5 T0 z8 d}
5 |; R" @3 f* {$ d7 G" W& f5 K5 w
stmt.Close()7 p9 k2 e' E! i8 P6 a& }! M+ k

, v* N' D' n8 t- r: e( u9 h}2 U2 T' v- D' Q
+ s  _- N5 d8 H6 J* k9 ]3 ]
三、总结
0 |- S' t. }% {4 ]$ j% {/ E$ ~+ s2 j) \2 O" @$ G5 q8 S  q, e
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。! R+ J* D/ G8 j- X. p7 @6 C
5 H, W/ N* X0 R' n4 P+ \2 T
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)8 W! V. Q) i3 h* Z/ @& d$ t0 Y( J' E
& T4 q1 c( \3 |/ v3 d  c# R
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
, n$ Y+ ?6 |: y5 o  j  h
4 ~3 `% j( G5 m, S' q总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
5 y3 |$ _% \& C4 J) d' ]————————————————  f  g7 Q- I  N1 z+ b6 {
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 J; F7 n0 V' ~4 u/ c" R
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961* Q  `( _# A- s2 D  ?
2 p8 W8 |* v4 R5 R; Q7 s* [8 `5 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 15:16 , Processed in 0.083107 second(s), 20 queries .

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