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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

$ L" Q; c) V* V2 Y" v一、数据插入 - INSERT
+ I  c" P5 ~; Z; ^( N9 X. z' r9 h! Q# c! n5 C& z
1.1 : DLang 插入数据" Q! e/ ]/ _. V% t7 l: I+ i

8 b0 N+ u0 Q$ _1 K3 r6 Gimport std.stdio;
1 U; s) l1 q# g; h8 r4 w3 `( m2 z# w4 f. t2 d3 S& q1 s& O0 d* J7 S6 E
import hunt.database;$ w/ N& `  z$ h; C/ v5 F  g) H$ Y

0 S2 J2 k, F; Q0 K. y9 Svoid main()
7 |) i$ y1 \, K- B# N$ y+ t$ M
: h# h3 W$ P  y6 e( s{3 y% z1 M/ X" E8 G- O* f7 M4 g7 ~/ i
  ?( O! |; u2 e
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
1 U8 n9 F8 ~- {0 }; u: w$ W. f' U0 Q- \. u8 ]
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);/ Y- ?* _6 {: W) S& u9 e0 v& T
1 T; X$ b# @4 R' }5 J+ {# `
// 打印插入数量9 o& A# O- v1 W
) o; |& F% X) n/ m
writeln(result);
1 T; J% G. g; Q1 b- t- y. S7 j! X( p) T3 E/ N
db.close();0 |5 Y9 R7 X3 H+ M, m- f

6 _1 F1 b; c+ F& A0 U! f1 G}, {8 f+ b5 A* l( F3 h; c

& M* @6 \5 `# r! C2 F' ]- T1.2 : Rust 插入数据, g: i5 e" i) O" H. Q9 k' X# |
; q  V/ T/ Z% V! A! H
extern crate postgres;
) Z; y2 w+ H, G" T3 @6 U% n- N, s) p2 m# U5 P6 h
use postgres::{Connection, SslMode};
  Y  Z8 p" M* z' @
1 ]: o4 O4 n: h6 ~- g/ S; Rfn main() {2 Q1 O. D+ T; {8 o# L) }8 l
2 D  R5 d' `% l: Y. n' h4 f
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();0 U. d; p, w; L  M. [& x" l$ k

& w6 ~; \* u" Iconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();) c9 n* o% l; Z  q% H* l: [. ?
9 T  E. Y6 _  K% v
}# S1 n+ i# f& m% D& p2 d8 x$ ~& U
+ R" ~4 e) C' E( C& f" J3 s
1.3 : Golang 插入数据
( b% C( U) r& M3 ]/ B0 v2 ~
) B9 C. F! k0 M, y- {import (
5 w' ~; W$ f$ y# h; O; r
; s  q# Y/ }0 _"database/sql"
  F( [2 U) Y! I9 O2 B. ^; y: J! d* ?) K# B4 a+ J2 Q1 A
"fmt"! g2 V" H; V$ U7 B5 W* v% @

( m6 e8 Y/ p1 Z. I& i) A8 k  n! ]_ "github.com/lib/pq"
. u$ G( d' Z9 y5 v9 A
. [0 t- g8 A/ m. J"time"
& q% h. A2 [$ a9 j# b" f$ x4 H9 I( d) L
"log"
2 E8 O# Y( ]! t" V- Q7 G: V* ?3 e! g- h; G( X$ C4 j
)) u" U2 n# _7 Z- b
- q3 R5 l. X7 a5 C. m
func main() {8 J# O& N" B# f" J, K5 @

; {* z$ ~0 K/ K: X5 `& p+ q! s% Hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")0 h5 `: _, y6 k& O6 p
( t/ T& b! N* y' K/ |0 ~3 {
if err != nil {$ T. ^, {: e* o+ s

( u6 V. Q3 l: r' Q- W/ A. W' y- flog.Fatal(err)
( r2 n) I6 ~4 i- z
/ \) b- ]9 E2 p) A7 t& s0 w1 breturn nil, o; t/ M0 V* D: V

! a- U2 |& q1 k" Q}1 r. D0 y5 K/ I7 W6 z
/ [, c" M6 P4 a
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")* \, {0 {4 F3 ~$ E# J7 e
! [; @  y# R+ v$ u
stmt.Exec()
9 H: k  T+ Q* [: F% ~7 u: ^9 `& m. n8 e. G. q2 |  O8 _
stmt.Close()
4 o8 `6 d8 l+ ?1 f0 H) x- d# o, U+ G" J) W0 P  y+ m5 q
}* J5 k) w( H& A! P! `

0 ]& @3 _: c( V3 y二、数据查询 - SELECT# z; y7 Q1 j% \
! c" k6 Z$ H; x
2.1 : DLang 查询数据
; j# d4 O, u) t7 W8 V
. w  a' a6 n7 E# \1 ?- t2 k) Aimport std.stdio;
! i! _+ _, ?0 s. X7 }
  U& x. a' E8 \5 K0 k: Y2 Cimport hunt.database;
  E) N6 V3 B6 {+ @7 v. z% Z4 o) n& i% e1 M, l- [
void main(), S! [# z" @* w2 G! [. {" S  @$ t
- F, \! u; z% O& X
{9 Y* E& E* n" X7 k/ U+ c1 i4 J! W

  Z9 A) h$ l* Q3 {) Aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
5 \; _5 R+ a% R7 s( h" D
8 ^" M6 a/ q6 o; q9 P9 Q; G$ @foreach(row; db.query("SELECT * FROM user LIMIT 10"))
0 A: z0 q; ]( s3 Z7 O! Y
* A3 ~* h$ M* ~7 l( ?6 R8 V{
( R/ x0 J. R3 k; @, i7 j
9 u# K( ^8 F8 @- Fwriteln(row["username"]);
' ?5 |* ]" Z/ c9 Z1 Y7 E" M1 {& o" `" H; F- P5 B! z( x5 i" O. R7 c
}
, Q. N1 f  L1 M( X8 b) |0 b
* o+ ^' U4 S% s# t( zdb.close();' r8 J1 q) _7 f: z2 k1 k
, N7 l  u7 o$ w$ P- P
}; g' ]4 s+ a6 @, @; h6 t

9 H# j3 C! m& v2.2 : Rust 查询数据
8 r3 i& m8 B" n* S' y
. S. i8 @# U# g7 k& `: |/ eextern crate postgres;- m1 X1 k+ J5 }& V, d4 ?

$ h5 l, G$ ?* Yuse postgres::{Connection, SslMode};0 A3 Q- r" U' ^  R8 o

& n: t/ [5 e" Z9 Z% g4 ffn main() {3 U# [9 A% N; f8 r

4 U$ n) |) H) L" D' `let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();+ ]$ ~* r1 M; S9 k' c0 |' k( u- F

7 S. M8 y9 x( @3 V/ k# a0 Efor row in &conn.query("SELECT * FROM user", &[]).unwrap();9 w' r% G6 w/ w' j

* S0 y$ Y% _; ?0 H( Q. c7 S7 K' dprintln!("Found person {}", row.get(0));
2 ~/ H4 H9 d8 t+ |1 `0 W0 B
; R( q* ~4 f* Q# o# I3 [$ Z, t& x' p}
( B' ]: }- ?- r. Y
0 z1 B5 {& K6 l4 J+ m}8 w% K+ h% L) Z* b- N8 d% ]: e

, E( x3 b  q5 X0 B9 T2.3 : Golang 查询数据* m- B* r2 \- ], W9 N

) K: P$ m, ?0 f$ bimport (+ y! c' L0 x6 ~7 d. {5 `7 c" u
, J0 n" G* @$ o: K' w8 f: ]+ l
"database/sql"1 H# Q7 T1 Z; L; u

& n5 I+ d- x/ {: m# F"fmt"
% D9 x$ C# i9 v3 W6 Q& \  O; Q  b# w5 ?! D
_ "github.com/lib/pq"
5 K3 p7 [! x" K. E( B
! v9 n% R5 D9 T& l* k; W% k( V"time", K" M; C: h7 n

! I* E& n: P3 y/ l6 Y9 q"log"7 K' s6 r) g* u% [4 r- }8 c
/ g  H  P4 T* G
)1 `% e0 X/ ^' b- h$ J; I. k

* |6 v# k' c7 @  N8 N6 p" ptype User struct {
; n* x' O) ^: U# Q) t9 T7 _) w, ?% G3 n+ V% H  U! w
UserName string  e+ A) |5 L$ H# c
: G; F" Z' V( z$ p
}- c' T. p- _3 g# Q' l
, l; P4 h6 _0 D/ Y3 y& [+ {: C$ h
func main() {
- k) {: A* }* B* L+ K! c( y
' L9 C  l3 N! ^" j  gdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")& V8 u# }& u$ w9 C# X5 ]8 I% `

$ u0 U4 X5 q7 N, Z. G/ y+ Z7 hif err != nil {
' f/ R4 U, y# U$ r8 r; Z! r: Y/ q  X9 M. d- x4 X
log.Fatal(err)
4 }" e) d/ n! M
9 V' K- f% P( n8 S5 ~return nil  j; j' I" x$ y1 T- B: v7 D
5 k5 u2 ^9 |7 h" ^4 H- O. C
}8 s3 [: a6 ~6 n

4 }4 L* e7 s: `6 ~& u- }user := User{}9 D5 f6 m: c9 {* B( f' ]: Z

6 ~0 r; v8 Y$ U  C  r. Q; ]! Rstmt := db.Query("SELECT * FROM user")/ d$ z" Z4 \, I6 ]/ H
* c$ B. y# Q/ y$ ?6 h
for rows.Next() {  w! L0 a7 Y. x3 n+ @

# l( y3 G' D3 v' Orows.Scan(&user.UserName)6 A" n8 F9 T* X$ l8 c& o# C: O* }. `

" B5 D" f) m/ b; N- p. a4 J" Rfmt.Println(user.UserName)9 d0 I0 v" ?. Y  `: [

- {9 z- c8 \5 S% P2 m6 T}+ @: Y. y2 m* ~1 A

4 j' e/ ?7 A, m4 rstmt.Close()) J( b( `3 F! p+ V9 s) x

9 r. w. {' u. O1 s  v4 w& Z4 o}2 g+ d% E+ d2 Y' ^, J7 I3 L
+ g+ ?( U! m" K1 n( h2 E
三、总结
7 {5 Z0 f) N5 Z6 f9 y, F4 M
* j$ Q# t; ^, t! m" c4 ?' i对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
  ^$ e+ Y1 t: w) F( @  |, r/ o. C7 t* D6 L0 V  X4 f
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)' i4 r, O3 X1 D0 W# L* F% B- ~% q
" ^% x% J0 F6 `# q
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。% W! L2 r% N1 i& ?, o( h
2 c. z* i) g& e  k- V
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
5 o  C. A. h9 r9 E' B% L6 r( u- i1 A' k————————————————+ |  I, `4 ~1 k) }) C8 [+ w
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, L, p, @) d4 {" I; G1 o" `
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
7 J2 @6 Z. [& o  ]
  j/ S' s* U* ~  E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-31 01:53 , Processed in 0.119542 second(s), 21 queries .

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