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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
9 \. r6 F" _$ F+ r% M- j
% x4 H9 i* p& B2 A一、数据插入 - INSERT3 V! t8 ~9 H+ W* R/ k6 f, c) A
9 A/ J! r9 f2 g1 x
1.1 : DLang 插入数据! F6 K3 R, d' N0 l" C# X! y

" _2 M7 @7 d) r: T, simport std.stdio;
/ i1 V3 ]0 k* j. E1 r6 Y, P) A$ w3 E: j! M5 ]* P  p
import hunt.database;
$ j5 t% H, @7 G% c6 C8 V7 P  S( B- {( T- g* R
void main()
. f$ D0 C, Y4 g0 s0 X+ z$ \, z# c
8 T9 v$ N2 N0 B9 d/ W{
, K, p" F5 ~5 Z  c$ z
$ T  p- i0 x( t0 e5 n' iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) k4 m6 O9 a) M/ c
. G, d: x1 |1 q7 h" d$ B# r- P
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);* C9 w* F0 y1 ^5 h4 n! \! ?% U$ l" I

4 o2 u. m" F* m' l/ d1 w. f: c+ L// 打印插入数量/ p! Y$ ^% Y1 V( J
3 J; |, k$ w5 h7 L
writeln(result);& ~$ f/ l8 q( @- `, l8 K' [
$ Y" y! l; X9 o8 X! I8 t
db.close();7 E! J4 o( x, i3 j5 y0 L# @6 Y
' V# [. Z9 l, T" T* s" K
}+ R3 x9 a6 m1 z. g

; P" @0 `/ f4 U3 i1 D* H4 K1.2 : Rust 插入数据7 y% q, L) U: [6 M

4 V6 M  x9 X6 V! |9 qextern crate postgres;
6 ^) g: E( ~; W2 ^6 A' e9 F: Y) j$ G  [4 |& b% ]5 d; p
use postgres::{Connection, SslMode};
: M( p- F3 C- \7 ~8 j/ ?9 c1 P
: \0 R: S( M# \% L2 Xfn main() {
" k/ [' D. E7 N3 u3 O% W0 o. J9 \$ q1 v  Z0 ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
& p1 o( |- a+ U& O( X7 m4 x6 D6 c/ v
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" R9 N1 h+ T, R3 Y/ C1 g! f& F

0 ]( W# i  V9 u( x7 ]: B; s}
0 u3 S/ U8 g. U9 _  b
2 O6 D: h2 I5 |1.3 : Golang 插入数据( q$ k! l4 s# T4 o/ J9 i4 y

" @" N6 I& z$ l3 C% ^' }import (; H$ U6 a4 |: @: B3 w! N

" u! ~! J/ s% K6 E3 r/ k"database/sql"$ @# f% S7 b) w' z
- {$ h' s5 h: c' y/ H! s* C
"fmt"  _$ r: j( M) w. j. H; u

0 j" P; L; m0 F- K: f% r8 s; E* G$ i5 \  d9 q_ "github.com/lib/pq"
$ o9 q: G4 V% @) I# f. L: X0 x" N5 t" ~7 d9 Y# \( y1 S
"time"9 z* H+ c% d. T. N
5 `. q' x& |1 ]0 F, B& H2 C, h$ b
"log"7 X2 w. a% K' R

" P( y9 a4 f1 ]+ {)" l( `! u$ ^* K" |3 E: p: A
8 t, l& S+ X/ ?! n+ |6 O9 F- x
func main() {, j' t$ F& K2 K9 `
* T# e: @1 ^/ _# R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
% r# {3 u1 E* B: Z3 f% q8 v$ W. u' [2 ^3 v1 x% @. m
if err != nil {
5 G0 t+ ~1 M' @  t" o. h/ g6 g' \6 M. U4 n5 E1 \7 n
log.Fatal(err)  h+ `5 T/ C4 w

2 U4 y2 _7 v( v0 K1 @+ M  M1 qreturn nil3 R; y1 H7 m; F! F4 P% e

- ^0 C* r  B  \9 i% f8 G( k}( [! N1 Z7 X# `$ Y1 t: b
; e$ Y# T; m3 p1 V. S
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
6 I( \3 V3 c$ ^2 ?/ D
) D7 F% y2 t8 p9 P/ r. w! xstmt.Exec()
. s. |3 u, }1 {3 t7 V
/ ?  c) R8 \/ {0 k" }stmt.Close()" d+ S  ~- K1 e2 b5 E% `" b' ~

3 ?0 B7 n! t' G}
' i; r& U7 x3 I( @; p
+ q) O) C2 F8 d& ^4 `3 R, |二、数据查询 - SELECT
8 z8 P% [  \5 \0 Z  ]* |0 D* b! @9 F2 |! I$ H. Z! I
2.1 : DLang 查询数据
' N% i/ I5 O) w$ R+ U6 G2 i# @( q3 U# a& g& i
import std.stdio;
) `( M% ]" U0 a& O/ g/ l
! N# \7 n1 x) Q* M$ m+ h: }import hunt.database;. K, U  \* l0 l5 b. e" m" U
3 F! j0 o' C# p# `4 G
void main()& _% G0 y% A4 w; K& q1 {9 D* \
1 ^7 y. n2 m+ O
{
* d  i2 {, J; ~0 l. B% F0 V( `: x! W# V. A# [4 q$ ~: a: X; p
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
/ U6 q9 Q# m+ @7 H5 K& U2 O- r# M5 o8 L' d9 ]5 _
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
% }/ U, }( L; k0 h6 r
6 g9 g7 s+ K+ k; w: M4 V{/ q3 b: n; v; o: m
; I3 o* f& t% y2 E( C
writeln(row["username"]);
4 L3 I$ \; i+ r/ n6 f; e  q- W' G( g) S  w0 u8 g7 k2 i
}
. B: u) @0 {7 A5 ~1 M
* Y7 O$ M9 F" X. z* V( `* xdb.close();
3 Q# K/ N2 f% L; O4 m  Z% Y0 d
2 v+ y3 K% P7 `  ?}0 o7 k: w# L9 L! E2 _3 O5 Z. Z. Z
# y/ i1 q4 a6 I) X. B, {: A. J
2.2 : Rust 查询数据1 G& H' L/ o  G; G3 N
6 V; K! K% p) R" B4 x, V. {
extern crate postgres;
; c$ |5 {+ m9 z2 [, W/ s8 h8 ]: F& F4 n, M& b, B
use postgres::{Connection, SslMode};; H6 e" m- F7 H4 g3 R) j

* i; X7 M0 N4 jfn main() {
+ L( H2 x- d  ]  J! J0 f2 ~3 j& Y- t" W) T# P7 k( E8 V' `6 S
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
( m$ Y; H$ Z" P; X# I
6 U$ @% t8 |0 E* d& yfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
! H% @6 B9 L: G. ^% i6 @, k& g# e  J  ^) |( H. {. |
println!("Found person {}", row.get(0));
5 w4 ~7 j: C- U2 `5 P
) U* a/ [/ f& t* V. a7 V7 [}
0 Y  w9 t- d  b2 r' U
$ r* z# F0 E; n* W1 n7 F}
* p" f3 F5 |' Z# T  S( s+ f1 N  w$ p8 W) y4 W2 x
2.3 : Golang 查询数据" _7 Y1 \7 x0 x3 w* u) h

2 R( O% k' g% y; g6 ximport (
5 Z# [8 n/ M$ Z. n1 q. x) m
. E5 Y1 m9 I0 S/ u9 i4 l# `"database/sql"9 T2 r$ v' Q  h8 {+ r
" C& g0 M, B% [- I6 H
"fmt"  }. B0 i+ T% G, }+ `! h

- V* e, D5 c6 I' Y_ "github.com/lib/pq"
. S9 m' y7 }+ s3 n, h. \8 _4 d3 ]/ q$ K% m. ?' a9 c0 T
"time"1 F, ]  R; k: H" a5 P; o' A

5 R9 D6 A+ X5 x1 X"log"
' f" U& W( v& s) P0 Y6 ^* _. d. N* o( Q0 U
)8 D7 q+ y( S4 n: _# G  z# W0 N
  K5 W0 F4 @- n; S/ Z
type User struct {
7 c! d6 ]7 {- G2 j$ }, L8 c6 H: v& [% g' Z- {  A" y, ~. G
UserName string
$ B6 ?- ^! K. p& r5 v- \9 h8 j; h5 T9 L2 b
}+ @6 s# R! C! t9 L

; S' z( ?  Z% U4 K6 `8 p1 }$ ifunc main() {$ X0 X* b7 S4 e
5 }& N$ d2 H) i/ D1 V' m
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 D, v; f8 Q6 k' p/ A; ?- E; G; L- k2 S1 O' I  D0 n
if err != nil {" F% ?# k* V  K0 m

% K  p- B; Y( R* ~/ Rlog.Fatal(err)
% Q6 v2 m! \7 ^
8 d1 I: s' w2 N! f0 h" }return nil
8 X; Z- c* w. v
5 U  ^: ]; p; E" N1 f}
# ~- t5 |& |5 b# e: k$ e! I
8 o; _4 v* z* v1 G/ @' {0 T6 vuser := User{}
, W9 s" G8 a8 j( ?3 F/ n
* ]. l) C/ b1 W0 ~stmt := db.Query("SELECT * FROM user")6 p5 ~) ^; ?  m, F

5 ~$ P# ~' t) n$ J# [* T2 m1 hfor rows.Next() {
: X% h: U6 N( G/ `/ ~" p
- ^. e0 g+ @# S2 Wrows.Scan(&user.UserName), R2 L/ c, I+ k$ Q% q$ d& F$ ~

1 u: S, i& r( s$ _& X3 Efmt.Println(user.UserName)
$ d# F$ M7 V) W5 `  E2 F3 z. g: G* u7 B
}% B# U" A5 g. r* {2 ]( T4 W
( d& Q0 n6 X: Y( H) F. }
stmt.Close()
* Z2 f4 j5 `- O! r2 }5 {. M$ ]  v; ]; q2 @
}8 E1 Y! U& e( _% V& x3 P/ H9 V
$ t5 w8 Y; O  o  G$ ~3 t
三、总结
4 Q1 T2 j/ Q- v: x  ?6 e# F% ?% X* b$ T3 W4 f6 _  x# i8 X& ^
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。& f: R! Q4 k7 x" D5 O, o0 p5 p

$ i+ f, a7 A& r# [这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
$ ^2 t( `* G* `7 ^
! c+ R3 J+ i2 b1 Z在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
$ I* Q  X8 s& j7 r- ^% \& t& k8 u2 D! \% w+ h6 `6 B
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。; G8 o$ G0 d& U. e0 [2 {
————————————————
) @) X8 R. a. F# `/ s! R! G版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ h% I. W8 I2 Y2 G( Y1 ^6 T原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339619 S3 i/ p1 h3 r1 w# P. \

+ O% [: @1 K* r, f% K/ c1 e3 m: f$ h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:02 , Processed in 0.107248 second(s), 19 queries .

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