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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。$ D4 e) l$ u6 W0 ~4 O
. q& D1 X+ V9 e4 L; |
一、数据插入 - INSERT8 a) @9 x. y) n0 }; V

4 N7 g5 c. a# C* q& D( E1.1 : DLang 插入数据
" {8 ~+ o0 g: _$ a+ Z3 z$ N2 W- ~  \6 e% ^/ K$ y
import std.stdio;) n& ], C2 E! u: ?7 f+ m- \+ l+ F5 i+ ^

( C4 [$ W1 n, G/ E, Eimport hunt.database;1 U0 T( C) T- n! X0 i

0 l) O7 w( q! V1 [1 q+ m2 Ivoid main()
. Q% t# _0 x9 g% ?" \' Q5 a0 R- \3 `/ d! Y
{
, h- `7 ~7 O6 t% r7 G  |4 X) ]* M: u- f# \- P  C
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 D) r7 z1 q+ t  k* X8 D: W3 j& M* q  u6 s4 G( H
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
. n  n: @, y8 I+ c( u: @# a& A) H$ J
// 打印插入数量! c1 n3 v" i4 z3 o- m+ i) @5 }' `
9 u. m+ }5 J! L% p- f
writeln(result);
# i4 C9 H/ U) ]0 j" F( {0 `9 W; v% C. C
db.close();- f6 v* d" {, k* D( G9 u

9 n  z7 D/ N, {3 B. [1 _}
& f9 {! i8 s; W2 z$ V2 R; X8 Y$ Q
1.2 : Rust 插入数据
( y# F" u+ |( d$ J  c8 G  E1 _+ h9 r" O/ f5 O
extern crate postgres;3 N. M* c) z' w& s1 @5 C
5 _5 ~, b; L3 m+ t; _* A
use postgres::{Connection, SslMode};
5 V, g. C, Q) G2 Q* y. O) N9 t2 D1 \
fn main() {
3 Q6 p, v$ h, r
0 \. B( P* _7 k- L6 ?  @* @let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% ~; J1 A, l3 p
7 b  F# F" \' L' w5 z
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
; w1 o( y% V2 w+ ?
7 G3 G  O& E5 g" x6 i/ D5 Y}* r7 v& ^8 ^, s7 F: j! N1 H
4 o2 b7 U; w5 S' d2 e! Z
1.3 : Golang 插入数据) W7 i  l2 F2 I8 t! }3 @
2 q% c8 W( b- E9 b1 L# a  x' z
import (3 g! N. K+ L! a7 _% f

4 e- q7 D* Q! J# r0 p/ W"database/sql"
' Y" [; K. }! A. o  C0 U6 Z$ I$ ?
( G$ y5 o% v' d( u"fmt"
' h3 b  Z) ?; e+ E; j' L" Y+ Q' S* L0 ?
_ "github.com/lib/pq"6 _3 Y9 c' I% W: o/ t" _$ Z

) s* T& G) q0 k4 ]# _"time") @: y( c  \' O  D0 p8 Q

" [8 E6 a4 j" O4 D( S% M% D"log"
' A/ {0 @: s( [  ]4 ?9 ^) E) S9 ^  ]* I  D
)& }8 w* R$ |( D0 p& b; B
  u! n  A% q1 x" X7 y9 T
func main() {
$ W; j: u3 o$ {7 L: L/ d7 R9 r4 i
& n: B$ \+ w; f5 J8 vdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")4 I0 t" s! t( W, A

9 X, u/ D5 H. d( P# Pif err != nil {8 @, N' k7 a( r$ i% j

' ?$ x( C9 e0 xlog.Fatal(err)
; H$ a1 B2 Q% ^* }6 T& I' _7 v+ C* b
return nil: ]: L- i" P; X
6 H, l8 x& m6 h; I9 r; ]
}
& p$ f! F# N& q3 Q
! M' W; b% Y& n( _0 b; L$ k4 bstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
) M( ?, g# o/ v% r# T# X$ C! a: E( v/ j0 i; D( n1 T
stmt.Exec()1 g% G1 E" A3 U& r
; K' N- u" `& G5 ?0 b; o3 n
stmt.Close(), V9 Y0 p: p! }" c" F

: U1 a3 C# e: Q! t' S- Z/ X}
+ m9 @' Z6 H) e/ v$ i- x- e. v3 h8 o3 k% A7 q. H) B9 P) g
二、数据查询 - SELECT
+ H% k1 E( Y+ D; ~1 E' |
8 G, Y9 [- @* Q- S, @$ W2.1 : DLang 查询数据" U( E4 X% L) S3 A( d

! ?0 \: w6 Y! Z# b* b5 @- M% n6 _+ o; Bimport std.stdio;9 V% s1 m" J- ~' z! o( Q) K
, x. a0 L, m6 x" q0 _9 y0 h- P* _
import hunt.database;
2 w0 h8 r0 t$ Y4 T# J
( D( P7 n* _5 P6 u: R. svoid main()
( w( o1 m& s' I0 j! I9 ^1 @/ ]' S# e
% e2 o& O8 [8 Q7 K; J: I* I{4 X+ u0 c7 A/ r% n1 y3 B( h
+ Q# X# q+ p* i8 o) f
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");. i5 k6 b% c+ |2 H' z! V+ v
/ `# Y3 @$ [; U, l
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
+ A. E4 W" l: n" v8 [9 M  ^- d" `% \# f# A8 X3 z; a
{3 O' r5 X! }9 f: E- \

/ s9 p% q$ p& k6 h) ]. Awriteln(row["username"]);
6 U0 n* i* _3 W* K+ j8 t# H( X# T5 W# q
}2 Y0 ?3 `, z- n! k
* {, m+ K! T. n/ ^1 q: }
db.close();$ N2 `, e+ ]( X# {' G' u9 @7 t6 @

  Y# u( T% d1 r}
% _, h9 N+ k% O* a" B
6 W8 e! E% n! c- L2 c+ B2.2 : Rust 查询数据
( `, n  K0 I: M
( v9 u% J, E& Zextern crate postgres;1 C* J( l3 J9 g- x
, W' g* X( I& `" n
use postgres::{Connection, SslMode};
  L5 J, H1 t5 j$ V9 I6 v9 S, c8 w# S& |( a" J5 `0 f
fn main() {
1 V4 X% }  @! ~5 q8 }( i0 @; X! k; O8 a+ D* i6 D, A% }$ U8 {2 F" L. B
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
: k# L7 Q2 J3 {2 D6 ^% J) q* ^  l2 {
$ X+ ]9 q* e+ c% R4 H6 i: \for row in &conn.query("SELECT * FROM user", &[]).unwrap();- @3 m; [, Y( e$ J( N$ ~
+ ~% C) P2 \5 L1 y" y: D  a% y' s5 f
println!("Found person {}", row.get(0));
% a+ X4 \) E+ @. g/ @$ d; x3 Q
( ^. }& t: N7 h2 b1 p4 r}7 ^! X+ H  ]6 }, y

* `5 A9 F- v$ |- W, o; m}
2 ]; O" @/ v2 u$ T( ?- z  n& @; j# F1 _: g5 P) P9 x& e
2.3 : Golang 查询数据
1 h; J+ d0 t2 R0 L& F* K1 C7 x8 U9 O& t3 j) Q* J! h6 T5 ]
import (6 P; W1 X- n. b7 i1 G
! g7 ?4 l+ }6 l2 M* c  V! f; `
"database/sql"
+ a4 ], g# K6 ?$ H
7 o" B4 B4 b) P6 w8 Q"fmt"
$ ?) E! i* j3 a, Y
, V4 _9 j0 \8 K7 a& W: [_ "github.com/lib/pq"
3 K6 e. b; g; X5 F* ]2 e3 a
/ r! H4 U+ l. C2 o"time"
7 H" u) k3 u5 s" E4 S: d- y' ]2 {! P8 P7 x5 x
"log"
5 V' T" |+ D$ \/ Y# z6 W  x& ]; Z
)" j3 q8 v" @+ Q  ]( ?2 L1 o

9 o2 W" a; s+ s# r* ]: z3 m& Gtype User struct {' y2 K$ H( A8 h/ c+ H/ O, A- T

6 X" N/ \( w1 f6 l6 u" j8 ?6 AUserName string
. G' t5 u8 ^# f5 T& f7 M. P& N
) q3 F. e+ @) L7 f" q, l' E}2 R1 M+ }0 v: E4 z/ q
( C9 b5 c7 L8 Q/ S- ]0 x6 J$ l. s( {7 O
func main() {% D$ k3 v$ [* y/ F

  ~" |  F5 u" o1 E" Ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")0 O) @' J! X8 _5 V# ~- @! B3 B
) o: t7 E( _( m' H
if err != nil {. ^3 s1 F! T) Q6 D3 t8 R4 ^* f
! {+ V2 B' U* d1 t
log.Fatal(err)# p& z) ~9 @( y( K0 |
1 D# A% ^& z5 \2 t( u
return nil0 C) h, B- e! z& _6 n/ [, z

5 S. E" M& n" l$ {/ o}; o2 F/ w  z! b+ V. C
* |6 q, H+ n9 Q* K4 y
user := User{}
4 R& }& {  o! {' E' S* P
6 V' D2 Q" q, U8 ]7 r3 I$ `stmt := db.Query("SELECT * FROM user")" k) k9 k& {" }9 H7 a- t2 D/ F

4 M. u9 C# q$ r2 h! Mfor rows.Next() {
, m! G9 C4 Q2 u; @, h. ]
5 s' S0 D' J' m: g8 C7 r- f" ~rows.Scan(&user.UserName). u8 I% L! k2 c
$ e- p6 O7 u' f% L- J% i9 N
fmt.Println(user.UserName)
( r7 O6 X4 Y# a3 |  E8 P) I0 O6 Q2 v5 |9 k5 M
}
3 T% I  ^; _% J* b3 I1 a
  m( H2 A' P5 G+ D9 Wstmt.Close()
5 ~/ X. i' y& z# |- u2 H! N! k+ y* D5 `+ q
}: S5 G8 Z7 z2 p9 d$ @+ A
) S0 S7 i* Z; @+ c& {
三、总结
$ p' J( {( ^" g9 X+ C* w: \% F
5 F. f/ W4 q  H$ @  ^对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) q6 f( u$ x! A& e% s

0 k% ^8 Q; a# l这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
( @# ?0 T7 v8 c
3 j$ p' y4 n4 }" P' R9 N9 j, c在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。5 l5 X6 @9 n. E9 s' w

' g, w" `* G; o- L4 }! e9 X- r总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。4 `: w- @! T- u) F
————————————————
; |# R" U2 C! `, O版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! i8 l. ^( U" H+ {
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339615 p. [6 \3 Z3 F* a& Y2 P+ }* v
& K" n1 y6 \- c; W% c" L" ~4 y) D( q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 12:09 , Processed in 0.130293 second(s), 19 queries .

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