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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
3 {1 q0 e4 \  `+ j; J+ O7 ?; L$ Y" i' c' Q' b; d
一、数据插入 - INSERT, M0 e. P/ T, P7 h
- K: W7 @& e% c5 ^
1.1 : DLang 插入数据5 K/ w+ B# Q$ g! z6 B/ ~

  q& @3 t  |7 f" n: o$ rimport std.stdio;
+ r1 S  p4 |7 A- E
+ F9 U' A7 F! z  ~import hunt.database;
5 w- y: }+ C+ {- v3 y9 W. {& x
0 B' C. ?& u6 ^/ ]8 f( Uvoid main()
! `& \4 A  Y# x" C0 j3 u/ C; w! r$ n- O/ q2 r2 }$ Q+ g
{
5 z8 d: d" {# V6 e4 |
; D: K2 ~' O! K3 Aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
1 \. D, c. m  J( T: a# ^( N" `* q' S3 y- U( s) _
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
' l% A* y' l- m' f5 N# ~/ t4 p! o9 j4 Q. D7 Y+ b. V2 B" p& M
// 打印插入数量- h7 W% ~# f  m- U% q  \! P
6 K; q2 R' N4 F. k5 _9 w
writeln(result);
7 f( l9 W8 Z2 H5 U  D) c
! O" s: s' j1 V3 qdb.close();6 I5 t5 c, Y3 B& z* {+ ~; E
- e, ~2 @+ q! V- g/ b. B# S
}, @  D+ U& L/ N. i+ p
! T$ p. ^# I+ o7 k! |0 ]; G# v% b
1.2 : Rust 插入数据
& v3 ^" Z. H3 ?# j7 |1 E9 K  e  M8 i& @! y" A
extern crate postgres;
% v$ X3 o' q( s1 G: {% a4 b) @+ Y
# o& X3 R; A2 I3 F3 R  uuse postgres::{Connection, SslMode};
8 N0 K; e% i2 [( D+ \5 `) C1 ^5 [' {: V. h- `# Q, s
fn main() {
( T, c8 j5 l; h$ `: p- V4 }% c& J6 [. U9 d! D* l6 p: k
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();) L: o+ D) A8 |6 K8 G
5 m2 q8 u# A, z# Z
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
, h1 A* r8 P9 c/ y& G6 G( }" k! q* k* _
}+ l2 ~' K) d& b+ N5 F
0 Y% T  G+ P' c1 r- q4 {: f
1.3 : Golang 插入数据
. f: Y0 m9 Z3 ^0 s  p8 a5 n! G3 o* |3 o7 Z# `
import (
$ i5 L( I/ t& S" H3 P* R' Y; d2 w  |9 u1 t: f# L
"database/sql"! g4 I5 M4 j7 ]7 U

/ z9 L% e% h* B+ o" n- F1 P) V"fmt"4 b1 A0 C& `: l% P6 d  ?9 f

. F0 d: N' h* O_ "github.com/lib/pq"/ O6 h. S$ E" I$ s/ U% ?

+ z! d( n$ j, M8 @# D2 o2 j"time"
5 r1 Z6 w. k+ c
+ L7 n2 W5 A. a1 t"log"
3 f: n5 q; ~+ j  H
4 Y% v; Q" j4 p: J)
/ z& B2 w8 x+ ^7 C7 Y7 n" e: |! O2 c0 |) h3 x0 `
func main() {  W5 U- y6 f7 Z; |  O! m/ w
, Q, ~: z9 N" a, c! ]" F5 F# O
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ I2 v) l. M2 u( F# _! n3 G5 @2 S: b, v
if err != nil {
, }4 A. {% m+ }2 C5 z/ i, ^; g8 B
8 X7 x! Y, ^+ h! k" Z- Glog.Fatal(err), `% X: z. v0 c* u! s0 V1 z" x

/ n# G2 I0 P  \; ]+ G8 yreturn nil$ Q; I- u  S# H/ f% {$ g. i7 u' Q
9 s3 V7 l6 Y6 Q- |0 q
}
0 R5 C. W0 `( |: u: M
8 W" R4 ]+ Y3 {stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
: l, M/ z( V- u5 y& W8 n% B4 T
# v& [4 ?* X$ l' [9 Estmt.Exec()
) k: @  p8 l# H! |- Q/ P( s) _! y; b1 ^9 x2 }! D7 Z6 ^
stmt.Close()
5 [! y# ]: @' G! @2 G2 Z5 x
: z' B  l7 B) T9 I! R8 a* y# ^" \}  x& A5 Q* @* i3 y( P
9 _( }$ s: [' r2 U' u# g& H& |
二、数据查询 - SELECT" k) y6 B# G% {/ [2 g. S$ o
! Z: H5 y' y2 z) Z6 `# F. J7 b
2.1 : DLang 查询数据
3 u: j9 j" V  z1 d6 Q# c; m4 k# h) _) B) e1 X: D/ k9 W
import std.stdio;# A* l: x1 C7 M! r. P

3 s" M1 s2 F6 z/ iimport hunt.database;
* O" x' x5 l# H; ]/ o7 V' s
. X4 l; n/ Z4 E2 o5 C3 ^void main()5 |. H/ U; u3 _$ A9 M" ]

1 _4 s. d9 q% B: |4 X{
& N" I$ |  H7 i1 {
, f( \- u9 {& U' P% Nauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
' @0 t* n4 R) X% ]' \9 |" a# [7 d# l# q/ w7 A9 K6 m. C' e! y
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
4 g$ o  o. i3 m3 X$ O( R% [2 h3 N" B) G. N1 a, A  E  D
{( [/ [) ?. _) s- K; u3 |/ d+ A% x
$ R% T& y5 i& E8 a7 q
writeln(row["username"]);$ F& i- g! x! s

" u3 R& @" A' c) S2 f}
6 r- b+ ]$ b( J' k8 V% l- T: J8 w/ f
db.close();
7 g, J. j( q7 u3 d/ f& X0 s2 h4 A: N% K3 @
}4 S( k; O* S  g6 v. K( M6 I
- p9 ]! c  N& |# s
2.2 : Rust 查询数据5 X/ @) [! D# q: z

& L' R! a, H  Gextern crate postgres;
0 I9 B, u' R6 z% l& e; B# {! y- x2 w/ T( D* E9 P/ Y% e& |
use postgres::{Connection, SslMode};
- O& \$ l/ w1 P1 X" u) ^8 ?" a
5 o6 ?) T" ]: U: \! F- Yfn main() {
, s. D( E6 y2 M* i
2 k. D! y% |7 t, |: i% Zlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, |# V' F( E! ?1 }1 B
$ l) f* t( u+ ?6 g& S
for row in &conn.query("SELECT * FROM user", &[]).unwrap();$ ]3 S  M# Z7 w8 k

3 v5 r/ l9 W7 J$ n: j; Jprintln!("Found person {}", row.get(0));( @. [/ u4 V$ L8 D7 E

7 \% H; g. o; t. N}2 M) `9 }! e8 Z1 V$ e% S

' C; S3 B5 C+ E8 a6 K9 w}
+ |6 y$ e  ?' P- b' @+ n1 A" y9 p1 U! }4 x5 q) Y& z0 C
2.3 : Golang 查询数据4 Z2 F- ^4 v; V9 a
- w# j: M4 e# G" Z: O
import (1 E& I/ J' X/ P3 t; ^
4 t' T! ~, K, p) ^
"database/sql"
7 h- k8 H* ]: v2 x
% ?' n: [* v. \) P6 D% I"fmt"5 f* F& G% h) V! C6 z. j; h
; X6 L, E9 _2 o" ~. b
_ "github.com/lib/pq"+ \& q% z) h3 ^
4 _: O5 ^8 ]! g* p$ J  u6 Y
"time"1 Q+ G6 j2 \/ k

0 t& q# B* y+ M# I- H# Z- m"log"$ p2 O4 {/ L- ?
5 r# e6 k8 a2 e+ W) D2 s8 k( K8 @
)9 U2 {) |( @% S9 z) ^

# {( ^$ C+ n$ ~( a& D) Q7 Htype User struct {
4 |; o0 a* c: Q0 e+ _3 o- [" H, l
UserName string: ^6 l; m6 v' K% t

% @4 V) X7 b! h# T}0 [0 K* _) ]0 I9 V
- j; w( E; }" v1 y: F
func main() {* h9 C5 p3 ?: h/ s8 q1 \
. i" L  q& M! |5 X9 C) L9 x" b/ R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
  T4 S( [- d4 A8 u& j# M) L% @4 h# v5 o- k
if err != nil {0 o& }5 Z4 _5 t- D; f
, _# ]$ J. Z' y/ a, F8 B
log.Fatal(err)3 V' r- g  Y  V4 X* V% i( y6 G

0 z& a; |1 Z$ @+ G+ ^return nil6 L" C* T/ T# F& Q4 @
+ o, K9 b! H2 E5 t' |
}' W9 n1 z0 @2 v# `4 d

7 l3 Y8 U1 G4 {8 K& Ouser := User{}
8 f, \' f9 h5 Z& h1 |! m
9 w; z( J; O; P- Y; e) Pstmt := db.Query("SELECT * FROM user")
; r2 q( d7 u3 D6 l5 {2 g9 R! b% c: D9 x8 }: p3 V/ y
for rows.Next() {& V. [: f7 b+ [5 E2 V
0 y$ W* P3 N9 X# z) Y8 D2 l
rows.Scan(&user.UserName)
* P* ~7 m5 {3 F* h: P$ \; H/ i4 ^+ U3 z, Z
fmt.Println(user.UserName)
, c& \" _  B+ W) a+ B
4 p1 M! u8 H% D+ U$ n3 m}
1 U0 W; J8 g6 ^& h' N: A1 [5 X0 Z
stmt.Close()" U7 s: S2 C+ O2 S
" Y+ M6 `9 U% p" Y6 D9 N, d% H
}6 h3 @/ q* e  J

: |" Z6 s9 C) }2 E三、总结
+ B4 E- T2 X" w( R/ L" l" ?  ?4 c; w# O7 c# a* `5 \8 o( G4 t
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
; \5 k2 H- C5 |. G% a( V
( @6 a* F4 W6 w8 O这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)) A3 T$ ]8 Q+ Y2 r
: F( y* U% F" t7 z' S
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。; v- c; }; T' y( U( P

" M* W4 ^3 j) v" Y( f) b总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 D, }) V7 H- n! X6 I————————————————/ c- D$ u% a. s# S- B. f. G0 l% X
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; B8 V2 n" @9 x" D4 K' `. S
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 @9 P- M/ _1 U: ?0 ~4 r1 P* p; X
# S" x6 p& P1 M& ?" ~! M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:01 , Processed in 0.065459 second(s), 19 queries .

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