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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
; s$ v$ o/ {0 f
7 b$ h) K6 Z: C一、数据插入 - INSERT* q: ^. U+ g* n- c+ N2 v
; E8 m% }9 x. W1 ]1 n" w$ v$ h( a, Q
1.1 : DLang 插入数据
3 {/ P% D+ s1 U! X8 J
+ R! h7 k0 k1 \1 s( h! {% Q8 Z8 Himport std.stdio;
  h1 c7 M: |% l/ j: b
9 W2 e- T( C1 \! _$ I& Kimport hunt.database;
6 z  ^7 Y" u4 F9 t2 N3 [0 M7 _+ c' e3 M4 e
void main()+ C4 V4 @( I; R" C

5 F, l+ b! ^/ ^{* ^* W, |- @9 s3 u0 q

9 P9 ~( C5 u4 c" iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 P3 d, Q$ y" a, h: U# {5 |2 |
4 e2 p7 P3 b- n! s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);1 F0 R+ D. t# c

; q$ S+ Y& h2 \4 X3 a& `8 v// 打印插入数量
# h0 ^  @8 C& J7 \( P" q, k
; ]; o* q$ v. ~3 o* Bwriteln(result);( ^0 L- H( L) A& M
1 q. C" q% M  Z/ w
db.close();
! G) ?7 A3 V/ l4 H2 Y6 g7 a7 g. {9 @$ n$ S! K$ k2 Y6 e( A/ W8 w
}8 l3 S- N# l0 \- |3 `8 K0 V

& F! N0 T$ q% p/ o& `, w1.2 : Rust 插入数据
* W$ T4 L0 S/ @- p+ ]) g& H; s
( p6 G% \7 o; f' m9 Y  Aextern crate postgres;1 P9 B, _( h* a9 W2 \6 E. \
6 a. w( c8 d% E9 B7 c6 l% I" k
use postgres::{Connection, SslMode};4 W- a' A$ T9 s5 x
% K  f9 I/ _! ^( d
fn main() {5 Q9 s6 I4 \, p! l: ^

$ b0 s/ W0 A  Hlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ I' D# M4 }. {" G
- d* U7 [* M3 Hconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();* j2 G1 a; j5 f4 k
% X% F8 s0 \, Z
}! C. Z, s) D( s! |0 M2 p' M
2 C5 v, v5 x! m% Z& e
1.3 : Golang 插入数据1 F: @0 k0 H% u* c7 {) R  ]$ r

7 Q' H: D( g) I- f' Timport (
1 k6 b/ L; N! @  @, n- k% Q! I( S$ G4 c( f: ?8 C% a6 q) ^
"database/sql"
8 R" R2 x. w& \7 H; E3 G* q5 `  Z  Q) p# b9 K6 S" a
"fmt") }1 a9 F7 ]0 M, i

  Z# V/ r. a+ J- R; K- O& D_ "github.com/lib/pq"1 F' K, q5 f3 f$ H  d* ^. ]
6 ~5 ~: g  q8 I: Q7 r$ k" M
"time"8 y( S+ |( }6 u

" M; c/ a& H( q"log"  c' r  |- s9 ]7 B7 w- q# h

% Y5 P+ G. o( W' A  z)$ e3 O( g* ?3 l% @! u& c& z
- z  b$ f6 x' D( O% C
func main() {- x: E3 q' N% V& v! |
' z6 C0 m% c% _7 I3 v2 j" {0 H5 K; D; |
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")- S0 o6 @$ p4 a
' n. _* a3 W* c  K8 p* x# l
if err != nil {
5 w  O8 J9 L/ c, O- {) i" `( d/ c8 r$ r' l! l
log.Fatal(err)3 R+ L' k& z  Q

: j# r1 n* J4 G( rreturn nil  n5 ?( b* g" p9 L; u  k$ o

% O/ ^$ B1 S/ u! Z}
3 D+ Q9 n; E  z( s2 G
3 Y; z  ?5 z3 `stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")8 ?& L) q7 a/ A: ^  r, y; H
4 K+ ?8 \1 [# C7 \! u! N$ ^8 q
stmt.Exec()
( f: i3 C! m+ e( e7 E
! K/ q! x3 }: Q( K3 V  Estmt.Close()
( r& V# T0 @3 e% s9 F9 K1 r" w* \9 K' G# @
}
' s% t( H) f( f9 }& _6 s
( x7 a5 R- ?) c' u$ b  |2 Y" t二、数据查询 - SELECT. Z0 k% d- t! K+ @- W' [
+ V/ o0 n+ G$ l( \/ o' }
2.1 : DLang 查询数据
3 h, l4 b9 Q6 s. q/ x, u: u6 {; F* ^% a4 q5 Z/ }/ L
import std.stdio;
2 Q& s6 h/ I3 L0 F+ S% F
, c  |1 Y8 S9 U/ d  U, K+ g& Himport hunt.database;  s/ b4 Y) r  M
8 q, T' D( q& o- s
void main()
, X& i! d' n! R9 }9 W& K" U
% U9 Z; n6 W0 q- f1 g" G{' d- ]: l& x8 H; Z4 C1 }) _* A7 Q

& K6 S5 `$ K! A4 Tauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
0 u5 K, F! y% \7 W+ W( G8 M2 f% V" f' g# u0 ^" J% t& x3 S
foreach(row; db.query("SELECT * FROM user LIMIT 10")): \+ D' R3 l$ o

' D' v; ^7 P' E{
" e) m! n# f+ m: h2 L: G4 G7 v6 r* J
% }+ d+ E% d1 q& J. vwriteln(row["username"]);
" t3 O; L0 n, l+ g/ R
/ ?+ h4 e1 E6 k& x/ z0 B+ n( r}
3 l! ^. e1 T7 q5 B* U# ^+ w9 S& G8 p& @' m' d# F  t
db.close();
1 f: E; g) R$ U9 C- o, y6 ]9 q( R& V: t0 H. Q
}1 Z8 Y+ ~# {% F* @  I3 d/ ?8 z
& Z: u) D  G' q; g- Y/ r
2.2 : Rust 查询数据1 X+ w  o: K! e
8 _0 K1 s" p: t8 j+ a5 m4 n6 V% p7 y
extern crate postgres;. T& D/ P8 W4 F% Q4 l7 i
3 x, P& X* M9 @$ q% H
use postgres::{Connection, SslMode};
' S( u- L, [( B2 L) p$ M1 B7 O3 d. Y) f* J
fn main() {8 m1 L9 M1 Z& Z5 O5 \: e# }

! P; ^7 F8 B! C  Hlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' [9 ?. b; X  P; C$ T7 I) z8 i
- v9 S. a  N6 V2 Z- B% Gfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
, I, _, m; U* c- @* v- Y! B5 w! B0 ^4 {8 |$ _
println!("Found person {}", row.get(0));, ^! l1 i1 k8 m- U9 b

3 u8 }8 O) \  I5 X0 _. J}4 ~- E/ \4 A( c4 r

: @% v2 V  _5 M% I8 \}5 ~2 j2 Z' C# ?7 h8 _2 \2 [

* [0 u) M( D( z% \2.3 : Golang 查询数据
4 g+ s- x* P2 G0 y! c0 M' x" h; c3 N
import () x* ?0 g4 B0 \& r

6 n' E& B: n# @0 j, t"database/sql"
+ N' [6 v+ i# I' i  Y
/ \6 T0 t2 f' a8 p& O, _+ I+ m) ?8 _"fmt"
* N9 I$ H1 c$ W. ?' G8 F* ]5 u7 L  z- t- g/ t6 m
_ "github.com/lib/pq"; B5 N3 D  X  `6 R) F0 x) u0 Y

6 k1 P' ]2 k% d3 G# L, P"time"
* s$ c8 v9 `- b! u4 C- P! p- C4 y' h+ T7 v# r" Q6 z
"log"$ T0 T& M: _% l

, J+ G' \+ G, d: j" x$ |, {)8 m. d2 N+ w/ B
1 K# c0 l) ~, m& P, l. _
type User struct {
+ _* {. }+ V" `6 |
% R" M- k4 d5 C* R2 C+ HUserName string
$ [- k! N) P! m
( _/ a) Q% ^% G; q! c8 P' _" E}
3 a& p% j1 i  t3 |) p" }: n# i8 F/ z! y& S3 \
func main() {* @. o: V, _6 k" i, E$ \

* p3 T. }7 u  U  Odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")* R/ |1 D( g% [  C" w

  O; A) ]0 h2 ^6 \+ B1 Z; v$ Jif err != nil {
; D3 N- m3 I$ X9 W. N- a1 c# K- c' ]
log.Fatal(err)  |) q. Q' R. u2 l( {" f9 L3 }
, ?! o+ K3 v# Y* N) D6 r+ C
return nil
6 R$ h* Y( S" g: E! ]6 }: O' M) y
+ S5 @* B8 U& d}) n( F% I5 M  F" B) E

# h( |0 n1 h* M3 wuser := User{}
" R- x5 Y( d) _$ j9 D# v$ I( U( E
; b1 ^7 B; j# B7 \7 K, ~stmt := db.Query("SELECT * FROM user")
9 n8 `% @* P" z. n3 Y9 K: B3 g) `5 @& E4 x' u0 u9 g$ t8 ~
for rows.Next() {
) {1 W7 Q$ }/ d; j
4 F6 ]* n0 Y+ [4 X9 X& Lrows.Scan(&user.UserName)0 L# |1 V) ?2 t$ X/ y
3 V  E5 z1 n6 o( v6 Y
fmt.Println(user.UserName)" w0 |* k7 A9 f) W$ |# m. u; Q: L

; X( m% S0 z* F" A7 |}
( |4 ]- S0 H3 ]. X) }& ?2 J5 N! }& |( @% ^% m5 |& c4 K
stmt.Close()' G* N3 Z1 a( a: m/ M; T( m9 `

: F5 Z. Y6 k& d; U}. y/ ]( i/ w3 d8 K

$ s- ?2 }0 I# n( r" i3 L三、总结# A- \) }9 V/ ~) D2 x# Z
5 }: p# h6 Y0 Y" W% C9 r$ H
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
' g5 ^8 u5 N* U) o4 K- W) o* R
" m& Q) R0 c  |' d. _! R- `这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)6 c2 f6 v0 ]0 D1 O0 w
% Z& P: E3 c$ L5 \3 R/ C* @
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。$ d3 z. H) N6 Q9 N

2 w: d, ]. Y3 C5 n2 _1 r# |总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
( _0 P8 K# ?  ~" O$ M$ W7 r8 l————————————————
+ l' c/ x) Y% w) D2 o版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! T( G6 g& S' `3 d6 a0 t' O原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
/ m  A; l7 p- O/ t9 u7 L: d4 }5 ~! Q. T" X/ c( U1 _( T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 16:14 , Processed in 0.063208 second(s), 19 queries .

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