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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

6 g( ^' ^* \- Q2 }! C一、数据插入 - INSERT
5 E# F6 q" j, V' N
2 t- g: w; S. r! D- z" o1.1 : DLang 插入数据
+ W; L" t- l2 M6 i% W/ V. B1 A( l/ w0 O
import std.stdio;
( j- B# _/ M/ O% s$ P* \8 W
1 m* L8 w# h5 \4 @import hunt.database;* E1 A7 C% @+ P, j3 I

5 |, b% }( Z0 ]* hvoid main()
& l5 N& ]. [; K
$ e+ M& S  \  p* `{
; L6 g3 s) _. H, k! b; p! e
% ]7 M. W3 d: p# x$ Eauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
9 X8 F3 V) Q; x. Y' _2 H7 k# ~8 o& w6 W) Y4 ~8 ^8 e( m
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
$ m4 S) J% K1 k# I+ v: `6 r. K: E* t; I) T1 Z$ D6 ]
// 打印插入数量/ K2 F5 M; n; T, O4 i

2 E" q; |% o9 T) f, q8 Rwriteln(result);
5 n! v8 ]' Y- o  J  a
3 J0 t+ r, Y+ L6 L/ C8 z1 s: cdb.close();
" G! P3 |# \* N2 Z  i
) z5 ^! \7 M. ?/ Q}
+ O" l. P4 A9 w/ t% F& f/ {& e7 Y* a. E
1.2 : Rust 插入数据
3 S0 Y7 Z% y/ `6 f  X8 J, |+ V& q3 T+ y
extern crate postgres;
' Y9 _3 O; k& N% a) g
: a% q8 u( A* T5 {; [1 \9 p4 G& T; [use postgres::{Connection, SslMode};
# l& _5 r( G. a$ e" ^' Q
. k0 K& h( R; Vfn main() {0 J2 u) `% p! O' H. w

' s: v* V( I  Q& ^let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
$ b4 A9 P8 p1 Y& j: k1 \- m: h8 _7 d3 x1 k) l0 I
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();: E9 N3 @: ^# P' l

- M8 P6 Y  |6 \7 D3 B9 K: G}
- U0 l" Q/ Z2 N3 a! E; k4 K8 V6 j8 _2 s  }" `5 ], R
1.3 : Golang 插入数据* |! ?4 Y& j! @

* D: M+ ~5 m. limport () P* l+ `7 i  P& }9 S

1 F0 f# R1 D$ _7 X/ q( _$ e) ]! `"database/sql"
1 `0 E: G" E* P- H7 A/ G4 D: p; I4 r  a; W* a0 g! o3 t
"fmt"
& W1 Q2 V7 B- V! q6 N
( ~, m4 @% z7 k; A; B& u! J_ "github.com/lib/pq"
0 E  S/ n& O8 E2 j2 z; g% h8 R+ h0 W+ w/ C* a
"time"
0 ]) w# }$ r: Z9 u( H) B, e% E, N
2 c& T. c4 }0 g! C; K) w; ]"log"9 c" u1 s5 C0 w  W. Q- J8 S
3 _! I2 U3 O% m* \
)0 o- g6 T/ K9 y6 t, R8 S+ ^

( _5 l# C. y9 I  V; ~! Ifunc main() {* m# p  C: ^1 B0 r
8 `4 A7 J) V6 C- M; o
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( r$ R" Y3 u) D" f( s* G) X

9 B1 @' I( f* M, h6 ]if err != nil {5 @# j8 d" r+ A/ D% r; [
, W" D7 n' A$ l+ S/ ~, ]# @
log.Fatal(err)  p% I+ y- _! Y6 O. N

) D( q, Z' \) [! D% {return nil
7 t0 T. f7 w" k4 s$ v
; ^% @/ f/ w' G# D; z: o}5 n% a2 j) q/ n+ U

6 i) l6 Q" n$ b0 W# h9 \7 Tstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")"), F1 \0 p8 n: a6 q1 i

! U. ?- K! e/ L9 p' Kstmt.Exec(): O% e/ }# N' f3 E
4 h( u$ V5 \  @, x5 `& o. I6 b1 q2 s
stmt.Close()" F! o$ j$ l! f) d& e7 |

: e' p, }; w2 {0 W3 z8 c}" b" C2 X! S+ g, }% ?# m

' N* X0 X* y6 ]! Z5 ^二、数据查询 - SELECT
2 e* o3 W' _( G0 H( a5 [
) {: N3 b6 }* ]$ F& Q2.1 : DLang 查询数据7 |1 y$ O- s5 |# o5 x4 i) G' K

. V4 K' i3 {0 z  H" ?import std.stdio;' n3 z4 @: X/ b5 i; G3 z

4 S! n0 k  v" g+ l# t5 p9 Qimport hunt.database;2 S8 H' E- z7 T( m  ~
  S$ `: d! L' m. w1 C: I; I7 a. f5 y/ m
void main()
8 G6 ^7 e0 Q' m2 B) _
% T. w" I  w( W) N- n( @0 g{
8 ^! v/ E; n* r+ S3 f5 v4 _* Z& m1 S
# g' E% f: o, i9 n5 B) Lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");! `( O* N1 z; _& z4 l

! _( q# O% T. y5 x" pforeach(row; db.query("SELECT * FROM user LIMIT 10"))
; v( y( y+ _: a* U1 ]6 c1 O. i1 z+ _- J" @
{
4 n! {6 N$ K, Y5 J% p' {+ r# d9 ]0 t4 I: ~& z7 j, ]* J
writeln(row["username"]);
3 i$ B( a: w1 h! Y5 _$ O
; {6 k0 ]5 U9 j7 T9 x% D+ j}1 X" J3 f2 L$ X4 h8 T: v6 u4 T7 z
; y9 O+ d5 M- [, e* C
db.close();
& `% \! A  F2 Q; M% C6 D) u8 ?4 G2 f8 ]
}
* f3 q: _/ a8 ^7 J5 K
2 m! M/ Q( N( A# _2.2 : Rust 查询数据# y# z! Q2 L, L" o5 p. e
; n' d4 F2 \! B: S% z" b, Y4 b0 ]0 h
extern crate postgres;
7 C; Z3 l, @( A5 L; v# t/ ^1 ^2 e, a# [2 n) [
use postgres::{Connection, SslMode};! u3 ]4 M' c, U/ T; W& P6 r

: U0 X! X' [% ?8 Y$ U  G+ Ifn main() {6 f& i' J% h/ v! U+ d+ @% Q+ k
- L# y5 H+ X6 I% i# z2 y
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
) T5 h' L4 U6 N( B3 l& b
9 B9 A4 F* Z( t3 Y3 h7 s9 x5 P8 Ffor row in &conn.query("SELECT * FROM user", &[]).unwrap();
( w0 S: I5 y- f- e, K% l
( B, E8 q# o3 ?( qprintln!("Found person {}", row.get(0));0 x1 G6 k5 G5 F) b" S" n

3 L4 K9 C/ j1 p' F6 a}
' b, ^0 ]( a, P/ V& t7 F
, Z3 a- i3 r* u$ x* Y& @8 f}: q- p1 B7 q2 x/ [5 W
. _# R: _; B% W4 H( |4 b( E9 i9 `
2.3 : Golang 查询数据
" ?) P  X* p& I# r5 X$ S, T' z7 o& w  y- ?3 L
import (7 g- L9 j0 w7 k2 K" p: A5 ~' u
" P5 d, Q* [6 y" h. T5 e& h
"database/sql"
# j$ N8 u3 Y% T  {. p8 o! E
( ?/ b8 C6 |+ U. i8 T  x# [* q"fmt"
0 X/ o' a+ ?0 ^! V" S% X+ F$ g! f, {2 w5 Q# s
_ "github.com/lib/pq"* T7 R1 H/ P7 O7 F4 f) X5 g  E

" |# ^5 v0 G6 {/ G" P+ t$ p/ r"time": \4 K3 e: A9 q: G& a$ `1 ^
" J7 [9 D: g. r# t
"log"
$ a2 U: {* }0 Y8 B& Q- L% a# g3 C/ N* s; l
)2 Y9 L) U, g1 V7 D7 }3 Y
' K3 Z" n3 w! d7 s4 S; ]6 F
type User struct {
  n( N8 {* l. {$ ]; P
  N2 Q3 F( A: r- }4 ]0 C$ pUserName string
; S% |+ i* N6 j7 _2 k* a# _6 S1 Y6 w3 R# F& V3 h# S' `* A
}. r' x) x, ?4 z; {: _4 s( N

3 M) K# @$ c; g. C" u: ufunc main() {: Y0 M1 v5 h) B& R# B( U6 l

5 P' F! W0 ]% \" L* kdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ a% m% a8 K$ f/ t9 a& @7 L  o  W+ {$ D( L1 w+ H$ [
if err != nil {
8 A9 ], v* p; W3 A9 }$ {' D/ ^: C6 n2 W; z- W$ ~# j) g. W& {& n
log.Fatal(err): O2 z9 K9 d3 j& d
; K: U& q2 Q8 L7 J, Z, Q
return nil
' j/ ]; T) O% e* `# c, p  \) o6 T1 {8 h2 Z- |) S4 b& d
}
5 ~+ k# M' x! O, c6 b1 c; s# n# n% v- }4 T
user := User{}
' P3 `  K9 {# @- y/ m( j. H" V
  `* W: ]/ t- n3 Cstmt := db.Query("SELECT * FROM user")7 ~2 X8 X" l$ J2 J8 l

4 _7 V! p) h. vfor rows.Next() {
% @+ H# A; ?  _4 _3 y. s4 N
+ G) Y! H6 A9 I: s; ]rows.Scan(&user.UserName)
$ p  ^. i+ F9 Y6 }( C
1 H) {  ?: o: w5 Pfmt.Println(user.UserName)
/ f' X( n7 a$ J4 Y+ b
$ D3 c8 G5 J- H5 }4 g}- \0 }" W) ^3 }+ {  y% P

# x4 r8 C8 E, n, V2 y# ystmt.Close()) j; S/ P; F. N& D6 E
2 z" L) r5 D; H) F
}( `0 |4 U9 T3 l* L

* t  d9 W# g" [% i& S, x' C三、总结
6 J* k6 v3 n$ b
. U6 r1 w4 Q, y对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
. T1 r* y, J  K" Q; B* z% E
" W  F, N6 o0 x8 u% ?3 p9 @这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
: |) A' w( m+ G- e8 `4 S" A6 b: U4 z$ t; l% Z1 B
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
5 e+ x4 r5 v1 N. }( u4 J3 w0 t; ]# [- h
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。# I, s. q3 X# @3 N# r$ V9 }
————————————————
) `9 @. d' U# ~( h版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) V' L  @, e7 D# f6 W% U
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
( O! z- @1 D( x+ n% w" a$ d; r1 d9 H1 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 17:12 , Processed in 0.131477 second(s), 21 queries .

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