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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1987|回复: 0

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

[复制链接]
发表于 2022-10-26 00:48:09 | 显示全部楼层 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
8 L/ n9 \+ U# `+ L0 L8 ?( I( M+ g# }' v: ~8 Z" C' ~+ I3 U. D
一、数据插入 - INSERT
5 E0 b  O6 ?, }: o# g1 V6 i+ r- q4 h
1.1 : DLang 插入数据
9 V9 ~9 |" H3 c- a. Q3 R6 }
9 F9 H& n6 I# X5 w7 Uimport std.stdio;* @% o& R& h6 u  ?3 W

4 h6 J3 a" x: p- I6 |import hunt.database;1 O. j- O4 g- h% S7 X, x/ J. O

( L& o: x( x* O4 W" b, ovoid main()
: I1 w: k: t9 k1 }7 G$ E: \6 C" L3 I$ l0 |
{
# l0 J5 q& c7 n7 d# l  F8 {) U
1 p- y& g3 D6 Gauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
) T- J1 L# r  A3 V2 u
- k9 v5 _' @) G# n: Nint result = db.execute(`INSERT INTO user(username) VALUES("test")`);  E$ p$ T% b' m) n

. W. G7 b# D4 M) ?+ s, _( S- _6 l// 打印插入数量
, B7 h+ [& H- u! k* d% f
' J* [- z$ a4 N/ Mwriteln(result);
) s7 q/ W+ d, E5 ^! D2 b
: }' m2 e7 x# l7 P0 h5 mdb.close();9 o* k, `! S* C" s' y! B2 u

. q! V: j# b( j- t/ a2 y1 `, f}: k; w( ^2 b/ b5 }

7 V4 L# {5 D( [8 I* z1.2 : Rust 插入数据) ~$ J0 D' o4 `: I5 s$ c1 v

/ b; t3 J) j3 T% {! }extern crate postgres;
4 h; S) u: n. v
1 \7 u' P- ?' h2 r+ P- z1 r- b8 Suse postgres::{Connection, SslMode};7 \- s( \( o' c0 M6 }) p+ R) c
+ v- R' D- ^) @% g9 o- V
fn main() {# Z* t- Z3 ]* X
# n5 h. O" p' w. u) t8 n
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();5 x6 X" x+ G+ o' [* R  O9 Z
% I. Z# q# I* v+ X3 J$ t( `( \# X
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
$ q9 C0 l. F5 L( Z6 c3 a
. n( |9 C. v( v+ s, _/ X}4 p0 w3 `6 j' P2 U  E0 B, i: n

$ F& m3 S3 r3 z3 p" v: \0 d1.3 : Golang 插入数据2 q# n( g- i$ B# K7 l$ R4 }1 X
! w0 O( R$ i6 E1 P$ o, D! T
import (0 o" |* |) {1 @8 |: A$ ?4 W
4 z2 I. }; z) B# a
"database/sql"+ q8 L4 b/ \/ J) e
: b1 c' T/ G! Y. s/ o
"fmt"
' i% x( r+ m: U0 X! p
& n6 z+ V1 n6 t  M/ V- b_ "github.com/lib/pq"
( m; u1 G3 v2 r7 L8 G8 w3 |# X  ?: H  [3 H9 |- }
"time"
7 U$ {! o6 I- ^5 w8 ~0 G6 s# C" M- ]4 L, A1 n
"log"
3 m$ c' Q  Q: v8 Q( C
! L/ ]6 h+ T; J2 `$ t. e( r)
* s7 V( F+ D! ^$ ^% Z* f4 K4 l/ p& t2 B& Z" G, w3 @
func main() {1 u4 `. m; x7 G+ E7 l1 a+ I' C2 S

0 v; y9 Z( J2 I+ mdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")- Y, f9 @" h1 p/ A* z* R, x
' ]9 |" B7 `0 U) ?
if err != nil {
5 X9 S  _% _) m  c2 v( {& x* W( _
/ R1 M1 W$ O1 g) n. X+ U) f7 {log.Fatal(err)
5 d! [7 H# k5 y: A* v: q% S+ y
2 k# a7 O5 P- z0 F8 g7 Rreturn nil
# J/ U. V5 Q. ^# ?4 B4 l6 @5 D- G' c3 e
}0 ~8 G! h1 W/ {

, o# A! S& N1 a1 S; `4 astmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
1 l3 M( h" d1 M% T* ~
/ l  D$ ~1 q; @$ K) vstmt.Exec()) u* h& Y  W" f) I

1 H' ^  @9 |- |  B# a; pstmt.Close()+ h* _& g5 }8 K- T- H8 e
' z4 ^8 _$ }6 P9 y7 S! l; G
}
2 c1 i5 f5 y3 I  ?" B: E6 y
. w  U$ w0 ]& x4 ^1 u& |二、数据查询 - SELECT
1 m9 N, ^# G4 c8 N/ S* S- s
7 r) h4 |1 T: ?2.1 : DLang 查询数据
# u, A3 V6 h  h5 g6 L
. M. D1 i& k7 v! H2 pimport std.stdio;
; e* C" n) i* i/ Z' Q+ g: K* v; b4 l: D1 F8 A
import hunt.database;
! l$ b0 b, k) i+ k( j' N8 c$ ~4 z
void main()4 R5 ^3 p/ ^2 e; [
2 Y5 C/ c+ ~$ m8 @- h
{$ b0 j5 k: {( F$ B8 q$ W, d
9 T, l1 P8 \: C# y% `/ X8 |0 P
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
& ]) Q  b8 \: Q$ ]# z! Z
& {( @% v* i  K) eforeach(row; db.query("SELECT * FROM user LIMIT 10"))
' O& `: ^1 T) W. D8 n, `: F, c' H0 f' x4 ]* f7 B
{
2 }6 @8 H" k) S. [9 I0 h; m; @
* P/ K2 ]3 ?9 M5 ?- c7 k! L; [writeln(row["username"]);
6 ?/ v1 P$ L0 a& J& H8 x( Q1 b
- W6 N( ]: n% s6 g$ z" K( H: O4 Z}7 R( S* |# u1 g

0 Q6 q9 f) ]: Z- T; bdb.close();
- S+ \9 z& P5 A% t7 A8 V8 g
; N/ u; E9 g4 W' B- \3 U6 ?8 G+ l}4 V! O) w- z: r( L" V
- h, R& f! c! M9 p: I6 Y7 r
2.2 : Rust 查询数据
  V) K! ]8 k4 {  a
& F3 R8 H7 S1 R2 f# K9 `* C; ]3 }extern crate postgres;1 |, S+ L8 }; G4 K. |
0 n( ?& y, O' m6 C3 x% g4 l
use postgres::{Connection, SslMode};# I" y8 ]* D4 E4 B6 d

% E9 Q) H) F0 u: r4 b. Tfn main() {4 E! A9 @/ U2 J- z& k. b% r, M

; B# M1 [0 {! klet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();8 |7 i' k+ E" C3 G& z
7 M) M) e# ]9 J+ r1 j
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( A/ W) w, _3 E  M8 p$ G9 d
# J) J. y5 A* `6 J9 }$ gprintln!("Found person {}", row.get(0));% n' }: r9 C# Q2 W9 h% `6 K9 v
2 ]8 d% n; q3 A9 f4 a
}
# X: @' A) Z+ g, j+ }  y- z; y0 a0 f
}
0 h6 v5 ^9 g5 O. a+ T- w1 q+ \; S
0 X/ r) j4 o% @/ B% f% U8 o2.3 : Golang 查询数据
& L& r' v" u5 }( q9 b* l8 D. Q' C" ~' l
5 ]: H& x. K8 Y$ T  v. W6 m7 F9 }import (
1 }+ {. x) \! E
& P7 K( |4 L! V$ o"database/sql"
9 T& }/ @2 Y* a2 Y: d+ Z; l9 z: P  B5 A, z3 o9 m2 H2 h
"fmt"
' t7 P9 s* b6 s& n- z
' |% w9 r9 v) l! A' S) a! C4 B_ "github.com/lib/pq"
* V6 J; f; |* a) d6 `# G+ i: |0 w: @( ?( ^' ^
"time"% Q. X0 ~- o9 C7 N8 z1 g
1 ?) _" u& R- W6 T% E
"log"
4 y! H5 o5 e  M
3 p3 ~& c9 e" w. y6 w$ [4 V)
: O6 l: i7 U' t% G7 F) u# j, k2 S8 c' t! ]" t4 E) p
type User struct {
$ g+ g$ D3 F- C( b- ?7 ^* K: a( Q/ l, u. m
UserName string" J( [  ?4 m0 S: J' y% K

" `8 L# [1 x' K% _, a}
4 }' I* X3 l0 V+ {
& a8 |: A9 H9 ~. K; ]' V, [func main() {
% p; L2 Y+ h6 H' t' h! F- F1 c+ ]3 k7 B* `: ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")2 I& E# s& v  S

9 Y+ q& l5 w' {7 `, Gif err != nil {
5 g* [  t$ d# L8 E2 L7 S+ _3 I" O+ F9 Z; I8 n( A
log.Fatal(err)
, c5 ]# b9 x: Q( }* L( ?8 e+ S
: j4 g! G( ?7 x* h- C0 c) c( s& ureturn nil1 M- |2 d! `( d7 I& Y
* \! H& }. S5 O- g, W5 o# o1 G3 l
}: w0 m" G& j+ K- \: o& ?2 w
* z' a- @# K' X( Y5 K
user := User{}
& b( ~9 H3 r) {* s5 @* r
1 J" A, H6 C- Kstmt := db.Query("SELECT * FROM user"). ?7 D! V5 l2 |/ A: N( P
1 M, ?; u2 t& O/ C, V$ g, ^0 [! }
for rows.Next() {
6 \) c7 v; R5 C) B, n6 l! n9 A. ]5 J0 ^
rows.Scan(&user.UserName)
  G5 g- y* X# x7 e3 }
( C' T0 C% F4 B* afmt.Println(user.UserName)
( N& i1 Q. C- @9 U
" F* S! k# p1 p. f5 P" v; ]}9 n- {0 I! o* b! [7 ?0 \
% e% j7 S! V$ t7 D
stmt.Close()' I) G, _% A' F# W
( H; j9 v6 j/ c- {
}
+ z: B' w! M/ ^! d# f+ H
4 G: s; f/ v6 m0 j三、总结4 u) |7 O* j! w! i6 E

# o6 z4 X. p% E/ g对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
6 I4 d1 F. v- Y4 B  t; f  g) i5 ~- I' w3 w
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
7 Y+ w, M; u5 T
& q$ M) m5 P# r4 W' v在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。% E" G4 x- K3 C! B: |

! s9 |7 R; Q  F$ X7 _7 u& c总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。5 V2 ~  Y" G0 J
————————————————% b1 a3 j1 H) n+ a0 A: W  a/ p
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* E$ G: W# _4 Q原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
+ O) B- i" v" B' t3 v4 k/ C: w4 W! p- A
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-19 05:33 , Processed in 0.121757 second(s), 22 queries .

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