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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

# F  d. ^4 h0 C6 Z( k) J一、数据插入 - INSERT
* Y4 S5 p, n0 C& k9 s/ T5 R) e! l7 h0 Y' L, }! o$ c
1.1 : DLang 插入数据# X  N) L! \" t2 k
' Q1 `. J" C" y( G8 M7 J
import std.stdio;+ ]5 i/ @' z) _# u7 d- M

8 p  P' w$ T$ ~2 U' rimport hunt.database;! m% j  e, s' ?

6 d* U: P. ~1 \! P8 `* e% W9 g9 Mvoid main()
0 I& b, r7 @( L. c' P
& u% w" ~4 U6 l# t{$ z' K: E  s! ~- @4 X' Q
( W/ o- {" p) F! p4 M
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");: u+ R; f6 h' v% d

; e) L# ~1 B5 K1 j, `- Fint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
3 t/ |  q; j, Q0 o- r. q( Z3 S5 l3 T& ^# `- d3 m7 b+ O
// 打印插入数量
) R$ B( m+ m+ Y! G& W7 v
& a, }& ^( [& g; E: N3 ?% S& v" Wwriteln(result);
& P( [' E: z; V; {6 y  z* ]' s' h# ?+ R# p8 ]4 U
db.close();: b$ b% y" c; S" |* V
: n2 h4 D  ~8 \! W6 Z5 f
}
9 P2 i% B; M8 n' ]
4 o! W  T' D. ~* z, w. J- T) W% I1.2 : Rust 插入数据
4 j4 R/ d5 K/ s" ~4 f( q
0 U% D4 L1 S6 s9 r/ P2 E5 A6 s5 Rextern crate postgres;
! d- ?# [' W5 G# E# G
, j) D" _: L5 e2 Z/ N, q4 Juse postgres::{Connection, SslMode};
4 z# L/ b0 N7 R( G' ^! U5 b) j
2 A; X2 @3 S  T1 B0 wfn main() {
. U+ s8 g" U0 r2 f" |/ T
* `( I: l5 ~, l5 J, `' P0 ?/ b7 Xlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 |0 A: E8 P" D8 m! g$ N4 x  F; U. n3 h9 W
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' [) b/ o4 ?, f+ s. p: k1 l& R+ }8 ~! v( {
}
) e6 `% z  \" U) M; G9 E6 t) y* u. @# l  Q, z2 i
1.3 : Golang 插入数据% U; l% ?) r  @+ O

* B, k' M2 f4 nimport (
- T7 Q7 w$ \0 z5 E. `" e
: |5 i. I, H4 d) R( A"database/sql"6 r  O7 Y2 {! _$ D- [
1 Z$ n; ]- r0 B
"fmt"5 e4 I2 K$ K% ?/ }) P0 a
/ I. h. v: w. t: O  J/ Q: }2 q
_ "github.com/lib/pq"
& \7 ~) k3 e. n% s6 W) V: \( k' g& s
"time". p( t2 I6 M5 D( _' Y+ Z0 X7 g  L

3 q0 S( F4 ]$ ~) J"log"1 X) H/ v' ]/ }& w
7 n* _4 [7 |0 N$ b; a: K
)
) _1 ]& i6 k; I" u) `+ R/ a$ y; f. T& \. _/ j2 a# X- ~
func main() {
: Z0 o% O4 T8 W7 z
9 M$ {& j' c( t/ ?db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")  k: ~" ^' ?# v9 D

/ `. l0 q0 J1 wif err != nil {
1 r$ c1 z9 N/ h; C! C7 M$ |( q7 ?
$ c  m. V  w/ s3 e' D2 zlog.Fatal(err)  S. n5 A$ Q7 A- q1 |

) T1 q  ?6 k; W; f6 Treturn nil
- m' f! ?0 t$ e: F2 B$ K3 q6 b) J, X# W  y) C7 i
}# v7 [( p0 i) G, f' d5 `: m

2 O/ L0 G  Q/ u: ]! |4 i5 a- hstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
* D4 r: k% s0 i; |) C/ W2 D; y( p8 h  m  J, B" ?; H! |
stmt.Exec()- l" f4 d: ^  f4 [
7 r3 l0 b( r$ d+ A
stmt.Close()
$ P0 ^$ J8 R0 d; e- d4 O( }. V3 ]# l
}
; E$ `# X$ N3 T5 Q6 ^& U
' w9 N* @- D' M* D1 \( Q二、数据查询 - SELECT% h: m7 Y+ z& O, h# s: Q! E
8 ?4 j3 {: l- b1 Q  E8 t: ~) G+ v
2.1 : DLang 查询数据
2 B+ S8 n$ e+ o: L( L' a6 g3 ], G" B* H* Y
import std.stdio;: Y6 G, b( \+ ~3 Y3 j- c4 L; i
  h0 d3 i. J& A3 c6 W
import hunt.database;
9 j8 C/ a1 V- V- b/ W  B
" M4 R1 i4 B4 E/ i3 |4 Ovoid main()
( U( R: S3 C$ z! U. q6 a7 B+ j- K+ O
{' k3 t0 h) E! R' q9 |7 B: H% ~

6 `1 d$ T& A8 Z( {$ k. H3 Hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ v, r9 i4 F+ t- t

( ^, F2 P& ^) y2 Kforeach(row; db.query("SELECT * FROM user LIMIT 10"))
4 l) [) `8 m$ Z5 o1 b5 l3 P* X% m1 z* K9 [
{
$ J" u4 x7 i( v* D6 @( G( e# g, y8 d! O) {! f8 r
writeln(row["username"]);
/ d& F$ y9 r7 W( Z* D8 F" N- |( G. f# c. W( Q6 J' t. O- [* J
}2 k" W9 w  C! ?7 t; c  e! ~
4 [4 Y7 `' D, \1 Z+ x# j, W
db.close();+ A  T  @3 B; N; z  c' r

% o! f  r2 ]9 ^6 u$ A}
! o2 H  T7 A! K' l6 O# Q& `8 ~
% A+ \  Y' X, b) s& ?& T4 k2.2 : Rust 查询数据
5 E5 h) l) A" O" {9 u4 _6 [% H  e+ e1 a
extern crate postgres;
. L1 w. D5 @9 r9 ^- g+ v' u
; l' s+ W3 _- cuse postgres::{Connection, SslMode};
" i' ?7 N; U  E3 e
. t1 }, D: I. ]& D1 |% H2 U! n" Ofn main() {* \% C) J/ g' Z" f7 _1 n' O
8 i) i: M( U# m8 ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
1 D0 c. T! I" `. ?5 o/ C6 m, w6 l  F' g, b
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
1 m; Q  d2 c: U6 z6 V1 B
# t$ b( f$ H% s  s8 t$ U' Oprintln!("Found person {}", row.get(0));& \0 E: H2 h/ o3 H+ W

& X; [% `# ]- M: A9 v% E" D}
' ?7 z- P$ l" C
- W( W% S2 M  a  I6 `1 y+ T0 r}" \: v% ~4 d$ E  n( G5 T

$ w+ h2 ?- N0 T4 o# U* Y( G2.3 : Golang 查询数据
2 @8 [4 A4 f" O! m& h3 W* ]" q( z3 n5 J4 t0 J% W2 J& L
import (. L% n' A6 W- [/ A$ \/ g

' h8 l- ], g- w: J! i5 l"database/sql"% ^' d# r: N: m7 X6 l

% Y& `% `# I4 a# N: v  l* y"fmt"- |3 J9 y- |- I4 G

$ r6 G, L$ r( K! Y  h3 b_ "github.com/lib/pq"" J. L2 K. E! K7 _. o

3 c' ]7 B& e/ R) A( o"time"
. x6 O( o& y7 o% M7 g* d. J) f( s; t
"log"; L0 N/ o( D+ b, Q) O& Z6 K

2 J  a# v% F% e, s& d5 H, u)
* W+ P& _' V4 l
! |+ z, ?, q4 t6 @5 otype User struct {" {% S. x; h2 u. ~6 B

. N/ `. {+ _; lUserName string
% V9 z+ u# s0 l7 V4 x' ?5 l) ?( j# J# P& @# M* B, S- A
}" D; l2 l" W, ^. X+ Z
, _9 T1 E2 \7 a3 `1 [/ @0 l
func main() {
) W! {, B. n0 I' {$ a2 ~
9 W, N( L) B# |. ^' ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
0 a/ D* l4 n1 x' p, q8 i& U6 u, p0 u. r$ N2 ?6 ]8 b1 p4 g& F8 \2 w
if err != nil {3 ~* e" r! r1 _' i# C7 M, X
8 O! {8 a2 O- o% e/ x
log.Fatal(err)
  R. n# `' g& m, r% _; W8 @+ q6 D* U% u
return nil, s6 [1 B4 P- ~
/ H- z9 a* G* d; K& B0 J; Y) S2 H
}
! ]2 n8 p- y0 U) @3 x5 z# d' e% j1 B) n2 ~% S2 }* E' K) U
user := User{}
* M) P5 U# P% i' ?% k$ w$ d& \8 C, o* D7 E- X9 O7 J9 y; h
stmt := db.Query("SELECT * FROM user")* q# T) q, }. F8 {( ]' X

  r. e. o8 T% A! ^for rows.Next() {9 w  D1 a- V: E2 d  w

2 o6 C: Y8 }( X" j. Frows.Scan(&user.UserName)' @4 U8 c/ m, b. `  S1 F  o

/ g, t9 [1 J( {* x0 t% mfmt.Println(user.UserName)
; V0 N! f- f9 y9 h: s7 K5 C
$ Y3 E6 @0 `8 M5 }' _}
+ u% ~( R$ l0 ?4 s+ O) Y, N5 t% Q. B6 U' V9 r- Q
stmt.Close()
+ k+ C+ r$ e' I# F$ s2 u$ F( q' v
}, P! x( t0 J" T* a+ a

9 c. |4 |) K) @; R: \9 M三、总结
+ I1 O- @2 x& J, Z7 \
1 b( W- o: C5 G2 o# a对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。! Q7 k. g9 ^( B' ~- s. |) ^( a& {
$ A( K" w  v: v) t
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
7 h2 c! A- L* Q5 n5 L3 V* `
2 d) v/ V9 s% a% ]* S在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。' J7 `% D% i$ D) A% T# @( A1 I

: P, t5 D0 u# E* b$ E+ V4 R' x总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。9 }) V+ [8 h0 p9 C# E
————————————————0 ]& d( T4 x  m
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 y% O7 R+ k7 s/ t/ n原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961: i' Q" ^' C% d
4 q6 T# {- B9 A7 x, ?: G; s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:32 , Processed in 0.055354 second(s), 20 queries .

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