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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
: a5 V7 L! L" ?5 q/ R) ^9 x* U/ o3 b
一、数据插入 - INSERT! I& Q/ {5 @7 X! P

' `" R$ ]! V9 B( k4 B1.1 : DLang 插入数据
+ u! ^! J, X, N5 q, _# q
; M4 Y: ]6 H5 B& Y' Z5 y8 fimport std.stdio;9 w3 O" @4 M4 Q" j% e
& N6 \0 x  |& I# U8 s
import hunt.database;1 V1 e; v. d3 S$ d0 _. d
/ q7 u1 x' v% k- F1 n$ v7 d* k
void main()
. ]9 |, b  \. E6 t- V. ^
. Z6 r& F  B! \. K% n. T3 A{
0 p1 [( B4 D7 U* X+ E' `" c  \- J. I1 \  l6 Q. U1 U
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 j* V; b  k6 J0 g7 H1 u% Z2 @' ~5 x& S
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);4 _- b" Y7 O- ~. R2 `% O" ^

: G, F$ A# g; M// 打印插入数量
. l/ }8 a0 Y: ~  d: P+ ~9 g8 q* x3 [  w9 B' w. N# W0 t
writeln(result);
& E) P/ T+ F. T! O1 N7 c  O5 e/ B6 V2 d2 b& B+ j
db.close();' g9 a  G) Q! T4 O

! |8 @5 u; \% \5 `5 c: u/ }}
- M7 x/ d- o( h2 t3 M% a% d( j. T0 b/ [
1.2 : Rust 插入数据1 @3 v, x' o6 l/ P9 M! p7 k6 |

4 H% W6 I4 A( C+ {' L5 Qextern crate postgres;$ {  R) N0 ]5 }! @5 L. m2 D

" F! e; k' f% O! muse postgres::{Connection, SslMode};
2 D: F6 X4 w# @8 w2 s4 V& ?3 t1 O& V, \1 z& k: l1 f
fn main() {, e: F/ W) Q- f. r) Z3 ?! f

% q* Q  n. g/ Z7 q: q0 ]let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 g8 X  [/ Q# I
7 g# Z+ ~3 V5 v/ [3 d6 U/ R6 d: c1 pconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();' z/ }" k" h7 Z: R7 I+ N" l" O% P

: Z: a: G. h( I9 S) V3 R}
7 P9 U  B( X. W' Q) b: w
. Y9 d7 ?! w  `) I1.3 : Golang 插入数据, L0 _1 O; t8 L5 H

* _1 Z8 @/ A9 m; q: V/ p$ A0 @import (
) n: C/ b$ A" M3 Z. N
8 O$ h' Y( v6 {9 n& B, e; {+ O"database/sql"
" N  G5 I8 _4 f3 j* V7 F3 y5 g, G0 h; e
"fmt"
0 b% T5 j0 o* ~' w. |4 x4 H
8 ]- E. o( \% i! T+ |, x5 U_ "github.com/lib/pq"
6 f6 H2 h4 y" z! ~/ y
' P' M0 [+ B7 `" a1 h2 T9 n- c+ c"time"
" O" b( G* m. O. H4 q
' k" u6 d+ `- a8 |"log"
" G. K' G2 N& Z+ D- }( N1 q+ ~9 Z
) V5 ^! }$ K  y2 i. O* {' I)
( {" n5 q5 Q3 w) f+ ]2 E
. A: G. g5 o9 d- A$ u3 `  F7 q1 a+ sfunc main() {- v1 Q$ G) m2 D2 N0 G
, z* M. R& w5 p* t. E+ f+ c9 m6 j
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")5 ]4 L3 S! p9 a2 p- D' q7 D/ A, H

. W- o% z6 }6 c# j; Sif err != nil {
9 q8 R. t2 y% h: J& y
4 _4 v" D3 p  K# T9 Hlog.Fatal(err)
4 n1 W) ^# Q$ |3 M5 p
6 C7 D. k# q6 N9 N: Z2 Ureturn nil
6 T4 i! e- S4 f0 P" N1 k# N: q
}
, z' J+ Y- W9 c
3 A* ~1 q& }8 [0 ^3 }7 a) qstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")3 b- k( _6 e7 B: p6 k3 R
5 A; m. t2 A: I# z) C
stmt.Exec()& n# F* X3 I" \8 d( A# e0 [7 ~

$ y" B4 ^8 i* ^1 a; V: B) ystmt.Close()
+ x/ t! G9 s, `& g% @5 ^, y! D0 L7 I
# Z& S/ S, E" W}* t$ [" s/ v# s" V4 J. T6 ^6 ]

" [0 U% T* W: f# M  }2 J二、数据查询 - SELECT% p* Z  a) I6 m; V" x
# z; z+ n  s5 T9 d. W
2.1 : DLang 查询数据
# O8 F. {& k3 w1 q" ?/ q: m& w8 P8 I0 f" t
import std.stdio;
' K4 V0 Y# U) A( W" P
7 ~" H: b! L0 K9 Fimport hunt.database;6 a/ O% m% t/ w* c2 I) J+ Q
9 T% ]- h. U) c. @
void main()" O7 T7 F6 B- t6 c3 c" {9 ]4 z  y

; P/ C5 B! l. H1 z3 Z3 j) s{. T& u" c& ~  g! F; k1 m7 e

) G" ]' y& V1 z/ |auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
! t/ B4 ~7 {- s" u5 t& m
2 x2 {4 ^' U8 c8 o/ U5 `% aforeach(row; db.query("SELECT * FROM user LIMIT 10"))
; S7 y/ R, `( o% `& D+ l" m1 u4 l: w$ J( @9 Q; X3 w
{1 c. Z0 w5 p9 z/ p* Z
* ~) b& h9 e% G1 }( ]; {
writeln(row["username"]);
' G8 V( R  ]# w8 Y7 \
- [2 I& f1 U; D6 Q) @3 ?* I}
3 }! j0 B( g6 I, s
  n$ y6 `2 Z  b7 z7 F& Hdb.close();: e& I! e. s$ w3 t2 _6 s4 @1 k
5 N1 [  t# L3 V3 v1 F% H
}/ U! W2 C5 m/ w
- h1 l8 Q' F4 A+ p: W
2.2 : Rust 查询数据
6 G& K; J% }. T  T
5 i4 W) X8 ^! q/ j9 textern crate postgres;4 \$ W* y4 C/ d, I* W

& M3 K$ z7 W9 w+ T+ V+ @use postgres::{Connection, SslMode};5 P5 w  q) w7 f) x

% L3 ^3 o5 H9 e: f. Sfn main() {
; c* Y% k8 @/ ], \  G" M9 T" l/ n4 k+ R5 b  e# E; q
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();( y5 [% A+ W+ ~- s5 p

) g( m6 V- h: u6 U' h4 d4 l9 Nfor row in &conn.query("SELECT * FROM user", &[]).unwrap();% U7 A3 Q& u2 w, C0 _. A
5 f) v0 f, Q1 _! m2 C
println!("Found person {}", row.get(0));. `0 d4 j& D: z2 u5 t

7 ~4 y0 P( R* X5 d}
. p2 T1 M( _5 T  Y/ @
, Q( U  W8 [6 g6 r. @% Y1 e}; c% d) v* D. S9 w( j# ^

9 m3 i4 C# j* r+ ~7 C2.3 : Golang 查询数据
3 q$ M+ w9 _' ?
8 L+ O, t' {! @# L# w% I2 _. ~import (
9 _- N) F. F- v# L/ X
' O* ~% ]2 G; }: h0 p& ?"database/sql"; U  V- F! _: b9 a

* h9 o) C1 A# a"fmt". K* X" C) H% Y3 D& F2 o

9 H7 C* `& X- M* b( X/ }_ "github.com/lib/pq"6 i% L  j8 m  I% Q) @% y2 j( A
) h0 d0 G& p7 \0 U7 }4 I
"time"- h4 |0 |: Z( H! ?$ U* l8 C& {

2 j  j5 H/ `+ O( {2 t8 X" f! a8 l"log"3 S: C' Z& U2 y3 k3 Q; e# I3 d

0 X% K1 Y& S4 L! p  [)9 U0 @: G1 _! b) w- ?

" A% y5 v1 z8 I/ {! n" t! l6 htype User struct {1 u2 E" s* W+ {1 E

+ `. |& \/ S  b& EUserName string- k/ r+ P( [# ^2 N

( t. G% y( I% Z4 I7 Y}; c2 J3 a# k2 j" G5 R* j- S& C9 I

' z0 r* ~1 {6 y5 g* g. dfunc main() {
- B  C& O, Y" O& j0 c: B4 l0 U4 |8 Y% G( A; `* r
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")! ]9 M; M- o: K+ E8 E6 s8 V
. d7 s+ `4 @% U3 W. {6 ?" |; W
if err != nil {
& h$ }" N( P  ]) x! r$ ]  L9 [% T
' k# \4 H+ A/ X3 |# H6 e0 _log.Fatal(err)
$ Y$ W3 [( E8 k2 }! i
: H1 l7 Z. c. f8 N0 J0 Ureturn nil
3 }* R* M8 Q/ V
% y5 B& D/ O, F$ |}
0 \2 h0 t, k  z' K  v# V1 w" z- H/ K) o6 ^* s& Z
user := User{}
- s# M, o6 F- d* N0 V9 z$ S6 b' e( m9 X" W3 g4 B
stmt := db.Query("SELECT * FROM user")* d* d+ \) C+ j  ~: n( F- g) C6 y

* ~4 q0 L. f6 \& Z( |/ W+ N6 ?; efor rows.Next() {
3 Q" o. Y! c0 J) A8 M" b3 g8 A/ J  N/ U; T
rows.Scan(&user.UserName)- D. z( Q4 e# H% ?6 g

  z- b& x# Y% ?$ `( e6 _fmt.Println(user.UserName)
& y1 p/ r1 u3 N% O  ?" S1 ^4 I
+ [/ Q/ T8 d! U9 W2 w}( Z* W5 @  C1 Y6 |0 ]3 y8 L4 [
& L3 d2 [$ C0 N& `- F' G2 \
stmt.Close()+ V4 I/ x" f3 [$ t, `# W

$ U7 o* s: {2 Z4 s1 X- V" T}
- m( n, v5 B  a: y7 r: f  `& t& `8 K+ l8 v8 N* c- @/ Y: O
三、总结2 {# O$ B" G4 R. h( }! u) G/ V5 D1 U

  J( ^( S; v7 K5 ?" [& h对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
8 w* M& W7 |1 a8 Q  ^7 T/ }! ^, X! p1 B8 Y! H8 h
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
& {- P: Z$ s: b5 r& W; l( L# J1 w* H/ Y' @4 _
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
8 [& p: Z; Z# e' o4 l2 C1 ^+ ]! b0 B
- v# n' @+ K4 [总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
, j0 Y0 X% B# D, g' c————————————————
( r: E6 U( w0 l; o+ A3 o' q7 r版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 T2 m( _6 L. X( h- D; g/ g/ V% [; U3 C8 A
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
1 H! s1 H8 D0 X0 B
# L% I) i' P6 G$ V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-2 14:57 , Processed in 0.103305 second(s), 19 queries .

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