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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
, N4 i8 e4 r: U5 o8 U. U$ |9 _' G3 `+ ~1 J+ a" C* c& [& T
一、数据插入 - INSERT
( @$ Y. s8 p0 b5 K# z% N  u$ y% f+ s+ V' s5 R$ G
1.1 : DLang 插入数据5 H/ S# D+ N* ^& i# |$ Y. G
7 W3 c* N7 A( j4 R
import std.stdio;
" O- [3 c2 o! d( r3 O+ R0 Y, `  q
0 \' Z, R. a) `' timport hunt.database;
0 h- e; v" N$ ?; b& L7 s$ q& ?0 n: F4 l, H/ v
void main()
: m5 \1 n8 v% {' Z. }* d$ W! V; N, h
' H+ V1 z8 m. N' C, X# @{- q9 ]: E" I: d: O" E
0 ~" S, l" M; b) E
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");: Y' w' c3 r5 ^+ z/ u

7 V2 [  n8 ^( n% qint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
0 P" ~3 S- g  ~9 O
4 }+ Z* L1 E2 G2 Q6 u! ~// 打印插入数量; M, O/ e) \, t

1 e0 w( j# I# ]1 {+ Owriteln(result);
7 u; H, O) U8 a2 m; f  k# r2 U9 R1 A& T( S5 ~2 R& ]: G2 D/ H
db.close();( X8 o" f5 l/ @0 E: n' Y
; Q+ t" \( I$ O( a5 g8 m2 y: h
}& N& R9 T' I/ ?
  ^. |0 q1 Y% E
1.2 : Rust 插入数据/ |$ z) x* C6 L9 F. o5 K
' }3 J& V- F9 @; D
extern crate postgres;
7 \; n0 g; N9 ?3 l2 \1 q+ ^5 h; o" y: a0 N  g; J
use postgres::{Connection, SslMode};
$ Z5 U7 D( p( K7 T! q2 w6 i, V, P5 J. N! u) I7 y! `8 n) s
fn main() {
& E9 J1 q! s# p4 @* j. J9 K" \0 H$ k" W" x1 i# {, c
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();6 r8 N- W0 e- T3 P1 K% V
9 a. a9 L0 g. x( ]' y* u
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();1 J* o5 t/ q- u+ c9 O8 n
# [$ }) j% Y! A3 J! B
}& H1 `/ @; X. g" Q. q+ i2 }
7 |* u1 P8 L( X5 R- o
1.3 : Golang 插入数据
% r2 @/ w9 c+ d2 e# r
# ]1 [; K1 h7 B  I' H( Ximport (- a5 `$ u: y. B- }" {

; y/ k2 {; n4 t" L"database/sql"
! i# b: T* \% ]; i2 q; C) s+ l) u' S6 b6 p( S+ U2 g$ ^
"fmt"
/ o7 e" B4 h: Q5 v) Y! g" g
* e8 C7 p1 w) n% U* [) e_ "github.com/lib/pq"
) G" V8 k: `5 W1 K  g3 ]9 i. m* Q- b7 q2 A9 @( a% q
"time"
; M8 l+ }5 C. h. Y4 k. ~: O( |2 G% a% \- R6 `, e& ~  q% ~" g
"log"
$ l8 N- K/ D$ A  J2 v" ?2 r2 _' W  a) G$ C- Y( ?) i
)
& Z8 k! I) _. |* r' v2 R6 E7 R& `1 V: ^6 V( {" l* t
func main() {$ u: B/ y" D* u' K$ j2 e+ @6 W
, P& c) ^: ]9 w; N- T# Z( k
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"): B  D: e8 K/ u' a- A) L- {) Z/ `

/ ^- P* B/ \( F# T6 e+ f3 Oif err != nil {
/ f. h3 C9 f& c# [1 l3 k
. l4 R* e( L& r4 l0 I5 W: qlog.Fatal(err)
' G8 |. z0 D* P) J
4 z/ h+ P+ ~8 x( C/ X7 K4 Nreturn nil
, `# d# R3 Q% M- @' d: \1 l2 t( d' ?( \8 _: A3 E
}, g4 h; d, q* z7 M

3 S3 X0 ^+ K( o! M+ h" T/ t/ ?9 ustmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")0 W3 q! G0 Y) i5 i# N6 J9 z

$ e# \5 s6 M0 V) `2 A( G0 E+ Jstmt.Exec()
# X' X9 x; |2 a5 Z; B( `# D7 ~4 g8 m6 |# g, n1 x( C! Y' V
stmt.Close()2 J! Y4 d( H, p8 Z* [3 A5 @

7 S( p2 H# Y/ L- M) C}+ n, w1 l+ b# p
1 I0 w* K; T. m- T$ D+ Y9 J
二、数据查询 - SELECT# V0 z* T) i" F* ?+ ]
  @$ t% m  s; K5 O, `+ S
2.1 : DLang 查询数据
1 R; E: E2 g% P& i. g4 @9 R8 ~7 U! G8 I- |: \- F  d# I
import std.stdio;
4 d' a1 m! Y  F( N  o, G5 K
0 ^) R" G3 p: S& `8 ^import hunt.database;- O; U/ D; P% P7 W

  [3 J1 n3 \, r6 o6 ~void main()
, k9 u, v: k9 K- F
+ W4 F; E+ P( r* n{
, ]5 }/ B, X. {# p& C( G
) U2 O% A7 h! `& D; Y+ L; yauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) [$ N/ \, G  Y8 [" Z5 X
) R3 H) Z) O9 z  h
foreach(row; db.query("SELECT * FROM user LIMIT 10"))' F! }. f) G- f7 B; M# H8 t8 _

/ n" p& x' d5 C: J{
0 D7 |7 }+ E5 n4 K
0 @- z9 g& q5 E/ Swriteln(row["username"]);
7 L# u+ H. G: D+ j- g1 o) K% A. r3 g* t
}
3 m& _# }2 v3 Q# K* D) P' Z+ \7 \! L6 N& j8 ]
db.close();6 `" ?- ?$ s/ A. i) ~3 Q2 R. C

- k, a0 {: c7 n, @6 Y) P}
9 u9 {& B, _& w# y- K! i  j0 Y2 i& v
2.2 : Rust 查询数据
) H$ _+ T1 h9 {4 F* ^! f( t+ p+ W/ m: V5 O/ j% v
extern crate postgres;
+ Z- z2 J7 i2 _1 K. g& Z
% J; v) F: `, v/ }$ C0 Guse postgres::{Connection, SslMode};
/ F+ y+ ?' n7 ^/ a3 c
4 o2 s/ c8 z/ L( k' _fn main() {
0 L+ D& d. h( g9 n
6 Q8 A& P9 w% F( V% K! `+ Ilet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' N( S, g$ @9 }# F/ r
4 f. ^! d+ ^' ]+ q7 C4 Sfor row in &conn.query("SELECT * FROM user", &[]).unwrap();- l* B; N, |5 n
7 c8 J$ \2 S! u1 F( K1 o
println!("Found person {}", row.get(0));6 o" l! z8 |) }& D' z
/ ]7 G4 F  _4 _" x# h+ [: V
}
! w  T, Q% G# L( G* C' {$ D/ @
  W& [* }- ?% r8 D6 j/ ?7 @# ]' K# T}8 y7 m8 w1 k+ N
, b! C( m6 @! u7 t& L4 E
2.3 : Golang 查询数据
, r  e) j; O. i& h& I9 \9 c9 |1 o$ N( M, m8 q. \
import (
2 x: Q& g% y0 ]: ?/ b( D- C
6 Q: f2 i1 k3 I; R  b" T"database/sql"! x3 r9 N3 x3 \3 J! Y9 a
. i) J$ e. F& a& `2 u& X& H
"fmt"" p+ W5 k( u0 G) n" [( O& N& P
1 @8 `& \8 G" _+ e- ^7 v" I4 R
_ "github.com/lib/pq"
4 T6 b; O: f$ i* i+ x% ~" X- O; Q* {# Y0 a6 C% D
"time"
( S- R3 m" T# _" M" Z+ u; o. f6 @$ s- A  _' v+ f5 x" p6 ?
"log"  Q* @9 P0 J) t: S7 z: b2 Y

3 b% o9 x7 w! ?% ~4 b) \)
, X: }$ h: R! F& M- A, I: |
+ ~+ {0 |6 G7 E, \: htype User struct {
& ]; T% A* P; k9 v" {% p& [# H4 o
) ?3 y) n  ~$ H& }. l6 }) y% t% FUserName string( {% r& H5 ]# O, O7 A

( s) t+ Z1 V2 m. T' Q- L2 ]- Z}& E. j& c$ O; B9 y6 m

. R# X5 {4 _. X' m3 e, X( gfunc main() {& {9 P, i9 O8 e+ ?* e
7 {2 B7 s0 M  q9 S# @
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
+ P. S/ }4 I4 T* [# L4 k
9 R, [  p, h) W0 z+ P3 kif err != nil {3 G. H5 N  m# ]& j

: I5 p4 ?9 g9 elog.Fatal(err)
( X. X' A2 r' E* P/ f: y2 v: c! G6 g9 q$ N5 ~6 C+ W( t
return nil
% ^% L/ ~* f0 u  i# j  k) C' d5 o: y6 G
}" i. b  u$ t  }

3 }1 ~& u7 y, ]user := User{}
) ^3 l7 M! `3 ?
) d; ^9 x+ E7 nstmt := db.Query("SELECT * FROM user")
* D) r9 x( T2 C" A) [, l, M' t* J
* u0 ?. p5 b. l( C9 r) lfor rows.Next() {- s# ?! Y! Y; p$ k. H
1 |% O  q& W: v0 S
rows.Scan(&user.UserName)
3 O( D+ p( p$ r4 _8 m
% u: B* ^5 ?* g" h4 A% e: |+ {/ Yfmt.Println(user.UserName)
3 l7 @4 V8 X% {. j. \% ^
! P+ L2 j+ [* Y# i2 Z. @' r}; Q$ N/ s* v  T& W
0 ]& a( \& K# h; @8 K  f! A
stmt.Close()
8 x- b6 {8 g5 E. H" b7 S! c
. M8 l  v3 g- k" B$ m}
: j* c9 N: H! b$ n! F. o5 h  x: b
8 A! w. S# I$ k+ G三、总结% M9 P; m9 X5 k/ n: K( \% m7 e
, h; d1 o1 y1 L; S& F  s- f% O
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
( v5 ?: J1 ?# N% o4 G. W( B1 S. ?3 @' @$ l0 D
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)  A5 O  }: S. f" E; g/ h3 l
9 S/ D% u* [/ B! H
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
3 R: g: {+ ^: s' P% i1 w! K" Z. T* i$ X$ ~  `& L+ A. t
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。' g$ @5 N8 Q+ ~% @. C
————————————————; G+ u! t1 {# d( Q' T) K
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, T' U2 C1 w+ l9 G- x* h( b
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961: D2 f( y: W3 p4 u) L& m
/ V1 D/ G- U$ Y- \6 T+ D2 U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:59 , Processed in 0.054968 second(s), 22 queries .

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