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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。8 V, \- s- J' `& Q5 }
4 x0 [. p9 E5 K4 Y, X, u
一、数据插入 - INSERT
. `, B9 L8 v2 m; M/ o+ H! ^5 `5 B2 v; A* g3 @2 y" K: u
1.1 : DLang 插入数据
% B  v  g6 X* J$ V0 i- y4 P2 n. @' _/ y9 h
import std.stdio;
9 ]# j7 Z8 k# j4 f' Z8 F" z# T% B
import hunt.database;
5 r6 F7 S( `1 ~) e- G+ q& U0 N0 O# ^* I$ `; r% E& g
void main()
$ c# e9 M2 g8 T9 u" h" A! C6 B3 B$ O
{
- a6 ^( C( r0 E; T& y- P8 n" ?6 J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");7 |& Q; G( N4 v0 i! J
: {% d6 n6 L1 I- A: V7 ^; N
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
2 h- x' J* B. M, L
( C$ ~5 {  U# L1 ~  g// 打印插入数量
- F( D- S' R0 Y* r0 T
) d/ n" d6 I/ u0 H7 [; a7 [) s# \- ?/ Awriteln(result);( J% O, A. v0 I- }1 H1 j

1 u: R+ Y- d& ydb.close();: O' K7 K: X" x/ X+ q' G% k
  H" I+ L& i. i6 p! \0 f2 J
}
* p7 @/ |5 |0 b% n7 E- k0 E, l# [4 [3 M! @
1.2 : Rust 插入数据
- y; V8 j7 i( \- ~- V8 T3 M, o$ [% J% s
extern crate postgres;8 _* q: i* b3 w: d1 U# ]
( L) |9 G0 `1 A+ |/ [, s
use postgres::{Connection, SslMode};
7 u6 b- b9 A  d$ d0 |7 a5 c  G! T# m  s6 n. x8 F' `
fn main() {* Z8 c2 w; `6 ^: X% K
9 n/ K. b3 ?1 w" N# O. ?8 V
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
1 g- t& f- t# B# }# Q4 e3 p' z9 d% ]
- p9 A1 w" H$ r; D& _% i$ J3 hconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
+ w' y3 v( e* P$ z1 A6 V4 ?" Y# Z. x9 B6 B, K/ D
}# {* y$ d* `; ^; c) \# q
. C4 {5 c" I7 X' i3 e' p9 T
1.3 : Golang 插入数据( M) B4 v( ?1 E: j8 l  [
6 @7 G! M: B- |5 Z- z, R
import (
- Z5 o. m0 b+ z' S: n8 ]; P$ i1 F) ~8 `: Y, C1 K0 H
"database/sql"# u* f# `8 Y! m

. ^! X; i5 M3 v4 l" Z"fmt"# \2 w2 W- V8 t- z
. W( t6 e9 m4 p/ {0 P
_ "github.com/lib/pq"
2 b2 ~  s: V% u* m
2 [- y+ s3 c0 s: Q7 b"time"8 }3 M  [3 l/ r2 [) S; j
' o' W1 [% L8 |9 O* z  _
"log"/ @) e! j: f. O1 s
+ J% h: O, D' w8 b
)- C+ o2 X  Y5 v

2 }! w8 P# ]" y/ T7 k& gfunc main() {
2 N* w. Q5 M+ ^# W# @( B0 i, X7 v/ ~# f! I0 j' @1 D: V6 t1 x
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")/ o+ V3 y  h1 q# h. N
5 X6 W: b7 s$ S: R, z
if err != nil {
2 q! y8 w/ _9 t$ _# T' S& Y1 y) @& k0 C3 T6 D, u/ c2 L
log.Fatal(err)
) Q: W- u$ a7 U9 w8 w1 T" q! q2 C( h# |% n9 p4 |/ H* {
return nil
7 x* |( }6 e+ t7 }4 Z
' b# B, D! I! I/ ^" O; j}
& N! ?  Y0 ^" X$ P2 ^
+ S- ~# j! x  O4 Y: V) F/ y% ostmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
: _- h; W( }* H; j
! t6 I; K$ \/ C. nstmt.Exec()
1 j: P2 r" n7 W
- I/ c3 N2 H4 `stmt.Close()
  e& v( H7 W( _' {) ?
; V1 I, w( h% A5 c}
3 S3 ]: P/ s$ U& N) G& f
2 T0 Q5 I8 J' W/ t" @/ M7 d- k二、数据查询 - SELECT; h- H3 z8 K  o- K, q  J# i2 U
6 o$ y/ d6 _% w( j: O( d
2.1 : DLang 查询数据
+ D* |2 u; \6 T3 |0 ^; A! g; I6 `2 O! f
import std.stdio;
8 L3 k. L, a1 \) r  J
; A. ?. ^$ i5 w" ~4 T: Oimport hunt.database;
* O% @) G* g" S! B8 J- K$ }
5 {7 J8 H" Z: S0 }# vvoid main()
1 g+ X" U& U3 N
; o4 o% l- h+ T8 E- [{
; b" Z# N' {& t/ M/ o
. g- O$ S7 @* N1 x! }* z  a  I9 [auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 d2 v, B% r, c7 U# }' Z

4 D( W' ~* {- x% t' a3 w. Dforeach(row; db.query("SELECT * FROM user LIMIT 10"))* m" _  {/ \; V  _  Q. Y: y' G

: c9 m% u: e) J{1 d6 T. A8 I% Z9 z  D
5 `1 j7 ~6 d2 L6 O
writeln(row["username"]);
+ W$ t, S7 Q) A
' D" ?$ P. H6 w" x( G( x! r- \) U7 z}
$ n9 Q& ?8 v. ~8 b7 L) s  d7 B" d
: W8 f5 H) m9 l/ N  y. P3 gdb.close();2 M3 z1 p) O5 {$ e

1 g( `2 l/ G. e  g& ^6 k}
% p/ M! B' y; W- `- {& G. e& X, k( ^* O1 A! F. f* Y
2.2 : Rust 查询数据1 h0 f- g9 f1 z; e" b
# ^; f2 C! X( ^' b
extern crate postgres;
- u5 g# D( j9 l9 l5 A2 t, x* c) p; k# g' J; M- F' m6 s1 p
use postgres::{Connection, SslMode};
! p7 e( ~: Y9 t8 M4 X  T
; a8 p6 ]4 a4 ^- ]( K/ mfn main() {- x! r# ~5 q4 B5 ?/ {

+ z) G7 q9 m3 t( Mlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();$ K8 n9 f5 [7 c
- M" a0 ~6 V% @* c  D" n
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
$ d9 c& _$ U" X) f  V( N2 L
9 |: Q- K# H2 |1 C# _println!("Found person {}", row.get(0));" U/ \# @* s5 {( K
" [  n# i/ u' N3 N9 D/ N
}
4 [9 K$ f7 V4 g3 L+ n) b$ F
; H1 e) L7 ^4 \}5 M- j! `; p( H) I- z

4 S# U  S* W) f- N7 ]( H+ X2 e" D, Z2.3 : Golang 查询数据! Z* }6 p5 |7 f* h/ _: a
6 g' d- V' p& h; P" G6 g% z
import (; j; V7 q3 \) n1 g
9 i0 K+ R7 `+ P5 D
"database/sql"
' `& z" y/ ]( }7 u. z' I
& ^6 K$ |1 |* n0 B6 X( x: A2 @7 n. d"fmt"1 ~* u; ^6 \, N% `2 ~

1 X/ y0 D( `8 H# ~1 i8 N_ "github.com/lib/pq"
5 u8 Y) R+ }- Y: X2 }3 r+ m; W" `2 r$ ~0 F# `$ h' o5 }
"time"# Y6 \" E0 P8 X1 I/ L& t$ @; {

) O% w  `0 A7 z"log"+ c1 K! a5 C7 J6 E) \: y% n$ A
  j3 l  K! c8 j* R0 p9 V% ~- L. n
)7 h0 q# v; J$ S" o

# S$ F  g& I6 e5 e, m7 K* itype User struct {4 X3 L1 t; i& Z

& ]# N! t* O5 b3 n( C+ t6 T$ oUserName string" @1 E  _! c. P1 C8 X& h
0 R+ A$ j# e* r& _( F) p. V" ~
}. ?1 `: h- f7 P3 j% T9 |7 E7 c
  O& o; S: c' n
func main() {
( u8 r, e- R: ~- N* H$ Z) l# e+ P+ L* ~* K) Y) i
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
% w. p  ^. e4 O. s- b9 t8 S; O* X. L( P- l: q
if err != nil {
0 d4 H: J+ t, p2 y1 q& J, A8 v" o2 u$ g. O
log.Fatal(err)9 q& j8 P. @# s* P! I- ]0 ?$ n

/ e# s7 ~2 z6 y; {7 breturn nil/ N0 O5 Y$ P' T0 f; ]- J

) Y" a! c/ j3 {5 H% d$ n}
3 _  b$ ~5 F7 O  o5 f; L$ t
% s; V7 V5 ]& z! Wuser := User{}+ C5 z6 a3 D' v

  J2 T0 J/ m9 ?( o+ |stmt := db.Query("SELECT * FROM user")
7 m3 E0 W% R( }1 |# I$ n7 x& l5 p' C. p/ T/ N. n- K. e( h' x
for rows.Next() {$ {7 y  ^! j5 `. z0 e, V  B( A: Y

) _0 b$ r. f8 e4 e8 q. o( R  Jrows.Scan(&user.UserName)
, A+ I' C4 N: V
' m2 d, L4 q* d, @# T$ yfmt.Println(user.UserName)
8 L, q4 a! E1 A6 J: \3 f$ s2 f) z2 u( p& U' x# y: ^
}  w9 P# w- Y) l& S- W

' q0 Z  j5 D0 e- a0 p! j$ H$ Bstmt.Close()" j& ^' ~7 F  x" t0 Y2 I9 u3 h7 C

6 d# l; W$ d! M8 K8 p}
9 j5 \8 ~) s( ~# i% Y1 _0 M* t) J0 Z" G: W8 S; J
三、总结
3 n+ W: Y; Y3 z* i
, B* n& |( B( N1 b对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) O# d2 n  h! o0 A/ ?1 M

& i8 P! }+ E6 J# Q3 S$ {这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
0 R/ G  J7 a6 r2 r- v+ S# i3 Z0 c* F  W7 ]- z% |9 Y
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
' U- M  s' K  ^) v8 x# h0 d# C+ Y" P* q7 e6 h; W6 M( R
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
& p! ~& R/ p/ ?————————————————0 c& H! Z- t5 x: P0 P+ p, l
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( G! q5 t; s. c
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961% [. Y- ^  o8 g: W/ v! m7 ~& _

9 a% ~! P# T# ]9 q' S8 O5 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 13:51 , Processed in 0.054366 second(s), 19 queries .

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