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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
. M# l, v3 t4 E+ w( w9 D! t7 J
1 ?6 h& \, a% T一、数据插入 - INSERT
: p0 ~* V/ G/ N& e' ^8 L6 l* [0 h5 _1 T
1.1 : DLang 插入数据
! U- H; N+ d+ A& u( u0 |* B6 K- B6 a" V$ z( O
import std.stdio;: u) a) w0 d4 j# l

' Q% o' o. h$ V! s1 k# L) Aimport hunt.database;" F0 B# T! x( u' C' b3 f0 b
  \2 W" A9 R" }
void main()5 o2 L2 m' x5 `1 ]( ?

; x4 S! O( a2 b0 d( P4 u{, F) L  \  r" n
4 A) P' S, ~9 t8 F0 e. }, Y
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
+ m! M% T" @2 W, p' H
" G8 ~, z, O/ ?7 q" O. _9 c: eint result = db.execute(`INSERT INTO user(username) VALUES("test")`);/ }% M3 D9 g9 W) x+ @6 O
$ }3 \* X% s6 h' l- D! N) j
// 打印插入数量
) [+ s1 l% Y/ D6 ^# t. R, f  o7 E' A4 d  x2 \" p: E6 ^8 k4 d8 b# n
writeln(result);
; G+ P3 T! G, V1 Y/ R; U
. i0 G7 w# J7 p- M. R0 i2 s8 Gdb.close();
& a. X! m% N9 W3 g( e2 z* q
6 H+ g* Q, Q9 `6 q}+ u3 Y0 P3 H  X- a" z. @

, R  i, U% ?/ N+ o- @& u1.2 : Rust 插入数据. Y# r. t; i9 E8 F
1 B- ^2 w) D& A0 i
extern crate postgres;. i2 j* e7 C, f2 t- e- ~% n* H

. e6 u: |# O. f: x- E6 @$ Muse postgres::{Connection, SslMode};1 A( p& t5 f: x

0 n  P9 p0 W2 C2 q2 ~  ofn main() {% T$ r0 }9 ], r' f6 _" c
& T9 X) D" a; A* q5 A- ~+ b
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
6 ?8 [9 y1 s- v$ N$ L4 `' T+ T; g, W. o6 Z7 O- p/ W4 U- [
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();$ _( p' P( ?3 i* s  K* u3 e

( w  Z" C( t9 C+ I" x* }}
; W8 {( |8 T8 M3 a: I3 ]) i5 o1 p" A* B. s7 [# R, u
1.3 : Golang 插入数据
* Y+ V8 y1 k" v4 G. D4 |7 J' [
3 y2 w) m9 L5 Q3 {import (
0 v( u6 O7 q9 x0 t" ^
- X' V4 E3 [! ]7 Z7 `"database/sql"* Z/ e3 t  y7 ]  u( p/ s& a  q
* e( b  E$ |( F: R1 ~  R3 E3 q
"fmt"
& Y+ E# ^9 r/ a  t( g" E
# j* R( Y0 K8 h/ H' @_ "github.com/lib/pq"
* F/ k( S3 G: U. K1 x
1 h7 b- h1 Q5 w3 o+ q6 v+ M"time"+ b) M6 R* U. W8 o6 h! M7 _/ w
7 c; k5 `4 d- n2 l
"log"
. O, R+ I. s5 N( n: A. j$ C
0 `5 s+ `' H. f8 }9 `)+ K9 Q5 w( i* O, _
' p( {8 ]; c7 p; m
func main() {) r0 u# _0 s/ @7 N
7 d* q* |3 c; L6 p8 N7 \" h
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")" T! T% c4 b3 R

& c5 ]- A* Z# e6 j' Bif err != nil {
' H0 X" ?& C/ x) W2 G5 X, a; d7 K" c9 k8 `6 k3 f
log.Fatal(err): C' L2 r: V/ R' U! A2 t6 D
" v; E# v1 \/ F6 d
return nil4 F8 h+ i6 E% q( t- u
8 W5 N; N  X+ A1 X0 G
}
, A2 s7 i1 i& B6 I7 q- |( j4 R1 q& I5 q9 l! {
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")3 {3 W, r. W' y8 v9 {
& Q( k( Q' o6 {. k( L7 [
stmt.Exec()% `- o+ }# D# i2 d

; ~9 W6 l8 m8 b2 r8 {/ H- M2 hstmt.Close()5 v/ e# y) z$ \- R

6 R  i9 K, u9 y/ M4 y$ m: v1 s, b) Y' |}' D3 F$ b3 N& H% T* [' G0 {
! i4 x* ?) \! ^$ K- `
二、数据查询 - SELECT* Z) J4 P$ f! X! I% [0 F( m
# ~4 F' }& h  g
2.1 : DLang 查询数据
- F* N% j: u* K: Z* t
7 p) W( m$ l# V/ Ximport std.stdio;4 T2 B2 B7 b' [. }. I
7 d) d) o: g  H$ y" n
import hunt.database;: O8 D) n6 J; r

0 ^. T" V4 \/ J7 p3 J3 a4 jvoid main()
1 r6 U, |4 O5 A' T5 D9 z. E, p' J/ j2 y$ I# i' `3 i& F" q9 H
{6 Z  j' a; s( S0 Z: E, a$ S! n

  @/ m+ b- D" `. `2 c5 yauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
1 D# D: x2 {: Q7 r1 ^9 ?; S( R( d4 [$ J3 o6 `
foreach(row; db.query("SELECT * FROM user LIMIT 10"))( |; a" l6 g0 w' X+ X. @3 m1 N

  h8 G* F' u4 w2 L8 v- l{
( K  c! E# t$ I, P$ s
' h0 f& b7 K7 \" ]/ |. A" \writeln(row["username"]);
; K3 Y) c( w7 G1 p# e6 G9 |$ `; b4 x+ A% N9 o6 H/ S, K) N
}6 {7 b0 e3 d4 o
' i% ?# {2 y- k' ^; L) u% A
db.close();+ w+ u0 z( h! C( t

5 L, P. d' `5 v" p}( Y4 a  v9 L/ n9 B
+ ^4 O1 i, j- U6 J, B5 H+ g* `
2.2 : Rust 查询数据
- u1 f+ O* b0 o( V& D3 x, v
6 ?6 Q2 s  P# A4 T+ Yextern crate postgres;
( P! k% a1 }) ~, [% [
$ m8 ?6 J& h( d* ]  ]: Quse postgres::{Connection, SslMode};, g5 ?7 s# \9 g. `

* p* P/ I" S* t3 T! r, ]8 Hfn main() {
9 Q  x! W7 o+ J  l
3 m. J' a% |; b/ A* Rlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
9 W1 p/ ^8 I. {; D" i
  B" L8 C6 s/ \0 w6 s" Kfor row in &conn.query("SELECT * FROM user", &[]).unwrap();# s3 F/ J! [1 x& h( Q& }& {) P1 s

2 K8 h4 r1 I9 _println!("Found person {}", row.get(0));  b' n) s; o, {9 u

" e7 Q" s9 d. U, H}. t# Y6 |+ _8 `% d7 I: k5 ?( \" I8 F

! o; ]/ ~1 {# U}! o$ S4 l% l" @0 [; ?- S

# t' j1 e+ |6 i2.3 : Golang 查询数据8 s2 w1 _- M7 F1 C5 c1 o8 D: b

" v% m: m2 a( `' d1 M  @0 vimport (  v! w) l+ Q9 u7 Q8 f

6 I" G# O2 n5 M"database/sql"/ X3 k8 X7 D' F- y
* B9 R) b: {5 k& L
"fmt"+ x5 d& d0 v2 k+ d4 u& q1 Z
9 q9 O' [  d' i% t- C" p7 N; P
_ "github.com/lib/pq", ~( i- M; ]5 I6 a+ k

  h  j9 m1 u# ?% l( a+ w3 f$ ~"time"
. b1 ^: h. e, a' O. Z' g" l- ]( ^) |
5 U, \+ L$ w- C8 ]# A"log"6 Y% C# |4 d1 m! G) Y
( Z; Y4 q& d5 i, ^% [  ?) J
)
; y2 V' [' ^2 r) W5 }
: i7 H# g7 O" f9 etype User struct {
) Z( m9 t* h: g3 W* _8 G- ~7 v* B- m' z  t8 M: p$ m
UserName string9 r2 f) X# Y* F+ T' q2 L9 R( {
7 V) n  y1 i4 {
}& e/ F9 n' m3 a  S
2 V" c8 A7 n& P
func main() {
$ _3 q) S5 M7 t' ?% p
/ F) f0 P) I! }& k4 udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 u9 H0 c0 i) P- V

! R$ j7 I, a- F& u8 }if err != nil {
3 K) M8 w: [! @" i
# l" U  d& A. y8 @% |, nlog.Fatal(err)
) F$ x  |# {+ t
& m' l5 t7 m9 \& c0 b, Freturn nil
6 j% B+ D" C" a$ e( t! S" D9 i( Z& n- j
}/ T- r  q+ O, ^
% c% j1 ^+ t3 ~- X
user := User{}. `( X3 v) [& H" f# n# g
( m' Z0 r4 P% i
stmt := db.Query("SELECT * FROM user")
$ V% Q& G: Z- {) i& e& V/ p: m6 j% N: l. }, _1 m8 `& `" V/ |
for rows.Next() {
5 N* _5 C1 B2 q7 X$ P8 `) q3 ]8 U! ^! t! w: L" i( u; g
rows.Scan(&user.UserName)
: l# u) |6 d$ p. r. L1 I" ^, p' d- r" \
fmt.Println(user.UserName)8 a$ [2 a/ o5 {3 `
- Q+ i1 q9 S" R; I' z. I
}
+ Y- @, s8 B6 G& D
0 P) p) J3 v+ i0 L* z6 e9 _) v3 Tstmt.Close()$ F) x9 v7 X+ k: E
+ ^# N9 N; W6 |( {; k
}6 k: k" t, M3 i8 K/ N) k

$ |: I' X& m; Z; x0 U* T三、总结; i: [$ d; S( L& c1 v

) S/ r8 b5 C# e: p对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。- a4 z$ m* ~' j! l/ K6 A

4 a: }( B  w4 N- [这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
( w' J5 \" H) v5 O3 L& y* }: `7 i, J6 V" [
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
+ i0 N/ Y6 ]7 q$ r+ I/ U7 M( |$ N2 ?9 t6 [  D6 [
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
* v% |2 S/ o, H* Z& l7 |————————————————
: x# o+ j# E  R  T3 W版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 L, W( O+ q/ o8 E. m! z" |原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961* Z2 ]; J' i) K, ?9 b. H+ w
. w6 L; [. ?) `, z; d: B+ C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 07:33 , Processed in 0.111074 second(s), 21 queries .

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