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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。) H. A5 h) J% G7 Y
5 _. I1 e' x8 i$ `$ i  h9 I" v
一、数据插入 - INSERT- M! n7 X7 t6 `' m* x
. S4 v$ \6 P- {
1.1 : DLang 插入数据1 c# f& W- Z5 ], R- R
' S1 d0 b' z" J8 h& y
import std.stdio;, C3 d/ X+ n* e

$ g- o4 g( a& w9 h! ~import hunt.database;8 c& f+ I- q9 \0 O" c

& C( n. r: U8 C: }: gvoid main()1 }! l0 h& W  `! L$ M( r
! [/ e: r. ?1 [9 P; p6 {- y( ], z7 j
{
  s' a/ s# X/ i4 g8 O- [) a# C! D% A6 o% j" }& V. O+ i& E+ `4 ^
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");6 K: c0 q& n7 `* Q/ L" w

) ^5 ~8 B0 U" eint result = db.execute(`INSERT INTO user(username) VALUES("test")`);, @5 W$ ]; V# D) ^
( |2 t7 c0 z! U$ V  t. t# H1 a+ T
// 打印插入数量
( L  _  k: ^( V( Q* S( k, e. L- Y/ ]& a! C) f/ o
writeln(result);5 u# i1 H4 g  {7 B* T' s2 m) E: z

) o4 k6 t1 f8 q6 j$ H4 idb.close();
7 C+ ~7 M8 e0 r6 L7 R* f6 y
7 B$ k6 |; F" }1 B: ^: v% A& P}
+ c6 W4 @" l* F+ x) u  g* h& ?) E  @3 }$ F8 [' j: [
1.2 : Rust 插入数据6 U; Y: f6 z8 w- \3 l: z1 Q

' P! o4 N) H: j. t) [; Aextern crate postgres;; z4 S4 Q5 h- z# _. h

3 r6 k: d% ~- u# a/ guse postgres::{Connection, SslMode};
4 V/ Y, }) M+ F) R9 A. X. a3 H7 @4 j( _. X9 I$ ^5 v4 d
fn main() {
& @! J* Q! t, @3 l0 y, w8 @: h! r. X3 I* i1 ^/ }
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();* }3 [) V" X# A7 ^  M' O4 c

% [6 F) [; K$ h4 Vconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
, W, U2 C! Y, O3 A  J2 h
: K& A+ |4 c; l, k9 M}
; F" F& _1 P) F/ y+ }( m2 d6 H6 B
9 `- W+ w! q% E; _0 y% b: S! m1.3 : Golang 插入数据- }1 {8 L# f% u9 ?1 T2 W: F3 Y

* T* J7 a* `& I" L& d3 qimport (
, r7 M  H. o$ X4 `4 {' ]$ T
3 R' g/ Q3 O5 U; l+ Z5 A% I"database/sql"' \# L9 b" c! p$ X4 R. x0 u& T
" t  I8 ?) X4 A5 H( j" {
"fmt"
3 e" P5 {- p( B2 y4 Z
, k2 u* B8 s) h" }/ d_ "github.com/lib/pq"9 e& y% i4 a3 v7 d: |+ u

0 D$ |( d$ y- J: O"time"
7 A6 h) p" g; \, o
( k7 @+ c% D8 @7 Q3 B3 t"log"; u3 B; D, U: ]. k9 g

, Z* x, j$ q9 l: a0 m6 m, C)
3 Y# O5 H+ g' h  m7 j. X  I2 ]2 n* }& I. B
func main() {2 |2 v. w+ s# r

1 a% ^( p0 w+ idb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 f' y1 a9 u+ z8 t* w3 x0 T, k
/ p2 c! }0 F( Y0 @: U4 o( p+ yif err != nil {6 U6 _& p0 ~2 O" k/ U/ m

* l$ I3 G$ V" hlog.Fatal(err)1 S* X$ z& k+ t

' V9 k  E% M, G# e/ o& K1 Q  Vreturn nil
- O: u( l# ?# q! o* u6 p6 x! N, m5 f2 ]6 ~* {
}
5 s: h( ?/ k, J! h/ z. N
0 [# {; z$ r& D1 z) }stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")+ p2 t" {; R! ]6 ^

! @( T$ B8 X! \; a0 Lstmt.Exec()
# `" F  Q! b' C  P/ G/ f' O( ~( x3 p& P
stmt.Close()- G% a; v8 E% ]6 B

+ ~3 f& X0 J3 G/ c1 l8 `}2 O" Q* \3 M& p8 K
# E; G  R6 G2 {- Z4 x( m
二、数据查询 - SELECT$ |( ~2 F$ e. F3 W# L" K
* F. b' I# k  O2 x- X8 z
2.1 : DLang 查询数据) Q# F, I  P  R) Z
, n1 r7 m1 n9 _( Z/ p
import std.stdio;; M& T1 z! u$ h% S  R( H
* a2 f1 y; Y3 V( b" P; D4 |
import hunt.database;
8 B% H4 [# u  }6 f$ s8 v9 h8 Y' K
' E9 r3 b& `' Y& N/ {void main()
( S, g; b  {% C$ N& ?. r1 a: }2 W
' o6 J4 P8 X: L* ~2 F) i6 a4 z8 `8 D{* ~. [: t; Y1 d9 u
) }  o/ n( y6 I$ ?) l: g9 p
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
6 w8 _, I5 W- @: q3 k2 H: g* s" V$ H, Q/ K/ I! K
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
3 q0 F3 W" q7 k" Z; U& g  I! i6 j; ~8 {: G9 t  m: _% o
{/ C5 C- P: H/ K# v( C8 B) ]

$ ^7 |3 f0 ^8 C% @writeln(row["username"]);6 [: e/ B; j8 ?4 q: r( [& J

8 x& O, x' z  e  N0 I! E}
, a8 H3 \6 B$ h! K$ d# o7 M6 o
/ ]6 ^; \0 \) M( F& e* G7 Rdb.close();8 `  b. w( \2 Y; L- p& Q
" t+ j; r2 B9 H& q; Y4 Q$ X7 C
}
& n0 r! z- x) y1 c* n9 L) |
/ Z! Q' X1 W8 D2.2 : Rust 查询数据3 W4 b9 p% A$ u. [  x* }
7 a2 n; t  k& c3 p
extern crate postgres;
7 m' h: Y0 L: {/ j4 |! T! t! B2 p/ l' m, ~
use postgres::{Connection, SslMode};6 {7 |1 B- e2 u& w0 w" B8 M& D

& ]2 T/ a: J' ]% V/ g! H7 Yfn main() {$ E3 d. O0 Q! B' D* H3 S9 N  @
3 P  n6 h1 A" T0 T
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
6 k8 _9 Z9 {+ ^% w$ Q% N9 y) B2 `; c5 R; s
/ W# t# a) E0 ]* mfor row in &conn.query("SELECT * FROM user", &[]).unwrap();" e6 [9 L* q5 J% o+ g+ u6 ^% Z* p
2 w2 T0 J% B) F
println!("Found person {}", row.get(0));  E+ q5 g/ k4 o% A2 b! M8 r

' M- O+ b6 D1 H" y% S& i7 W4 d}
8 f+ s, o6 R; i1 d  z: S3 O) N
( ]0 t$ Y; b. w; x; k}7 A- G; t1 |. V$ Y) M3 l4 Y

3 u( Q5 l9 G1 ~) `; F% v2 @2.3 : Golang 查询数据
# C3 p$ w/ i* {( g! o/ d4 H2 j7 G1 F  U( \
import (& e" k  m2 f: [5 y) L& j
( V5 Y! k3 U( s1 H
"database/sql"
6 {. h0 O' e; C
0 e  e8 G9 I; l6 Y; ~5 x* F"fmt") t# y' C3 R/ n. a& m

& g  n+ ]2 H3 y. F7 |: U_ "github.com/lib/pq"* x" y. A# V% O8 L
/ G$ w( f# n8 j/ K# z
"time"* m$ `6 i& P5 t/ u8 b
5 m* j. U: r+ J- D, N$ _
"log"& N3 R9 V; a2 E- k; g

- ^# b' s4 q; I& ~9 Q# r)
+ `1 x1 t6 q9 D3 E4 r& ]
1 \5 W) |1 j  {5 e3 S+ ?6 b/ Ktype User struct {7 K; {& h" K8 S" x

6 ?( r6 Q7 S  X4 v- O9 U  U' ]UserName string
+ k# O5 ^& _. ~8 `7 Z2 H- u' J& d, n0 j+ H4 }
}
( H' Q, H1 s/ c; {1 p# z7 {7 N$ ]0 M& v2 l
func main() {
: T, W& J, n  {) V3 L, ~% A7 H* j& @8 Z( \6 p& j8 m
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")+ ?$ N1 {' V* F% _
2 }0 }, [% k2 F4 f8 Q/ v! B4 i
if err != nil {
5 c% f9 D& E6 l  s& x
5 A9 O4 h/ V2 Ulog.Fatal(err)
9 [, I! n' v$ D' M2 X- B% ]1 k( e0 i: n: ^% x8 t$ m# f" S/ _+ g
return nil
& F+ \! {) P7 [) \/ R: \8 ^" Z. X9 w
}" x+ D$ ?7 w- u7 |, `6 d

( Z' g& |0 w+ Z; r9 Nuser := User{}
$ x( A& k) K2 T5 \  {, _! X0 K0 ~
stmt := db.Query("SELECT * FROM user")
# s9 |, }; d+ k" g
$ v3 f5 E, r: I6 g! K( g( a* {% {for rows.Next() {6 \. ?  `1 a* F  L) J; H

# s$ `( X2 B+ J/ H" [rows.Scan(&user.UserName)" c: U7 C- x' ?/ O) ^; ]

% @7 E8 r6 E8 g, Kfmt.Println(user.UserName)$ \' [* ]; ?6 I' X8 _2 Z

' f: R0 l  O9 W2 |}
8 ^" V8 w  N, E7 b( c
8 q  ?6 q2 ^# O0 C1 Ustmt.Close()
& E5 _. J0 P& L6 C% V! X. m/ h$ \5 y9 d' C* E0 E9 @
}
% H1 n. |" U: w9 D, ], |
- c2 _5 M0 H, o7 I8 [三、总结
  z. p1 ~' H3 U+ f2 G
# E% F1 T+ v* j$ @) e对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。; v( Q( t& x: @( V/ L9 ^* U2 [
; M" ^6 f% ^: m$ `' `! ]
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)3 b, D+ g- h0 T5 J( W, ?

, Y9 L; f- Z5 b, W% s在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
* r0 W1 ]' Y. d' u+ r9 r
, c8 V# @6 Z5 N  S, f总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
. j& B- o% _- K6 _————————————————8 t+ D: I6 L0 O; V6 K) B0 a# m
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 f, R0 e( }' m. t原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961# p: G, I+ e1 t* F1 F9 [
5 |4 Y' a( Y/ {# ?. g. Z: m! q4 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 12:57 , Processed in 0.052706 second(s), 22 queries .

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