cncml手绘网

标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式 [打印本页]

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。& Z- l, D( y; ]  W: y3 `: F
/ i1 S, n. E* C% D
一、数据插入 - INSERT: N) o3 R- L$ a  ]3 V# X
& \* I3 B5 F# e0 C+ |% S9 j
1.1 : DLang 插入数据. {. e* G3 x: p  _

) a. r: u  R2 I" e- E! limport std.stdio;
. z9 B$ W# w, ~' ~& M& M5 S9 ]  A
. \. V  V/ v% uimport hunt.database;
' M, u: W  x" @, v0 J
0 a4 i4 \/ B# ]void main()# J6 r  ]/ Q3 X! X8 q

; N) i7 W! f& F6 K{
$ m. H) I" e" d3 Z3 C. _" c3 e- P' Y7 d. T0 D
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");. `+ }- ^0 V, h/ Y, q

0 ~0 b* H' C7 \. qint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
, k- w% ^4 G: F9 L1 `
; p0 E" H- Z" X# X// 打印插入数量
% Z" b2 Y" V. U$ G# Q  S& G" ], N- @2 u6 A5 q0 t
writeln(result);
* y' Q/ D. C5 t6 h, _( D2 V
; I) V' F0 @( @" |+ Ydb.close();8 b' P; e( h+ k# v5 R- J! e
* [" ~4 g: c1 b0 B" u4 ~7 @
}& F& U, {! W6 i
2 D  t! e# z! h1 W
1.2 : Rust 插入数据- ^; Q) J" F8 ?

, D" v; K6 n/ g) o+ K1 V9 p- Wextern crate postgres;
0 J3 e( W; r* o! I3 c/ m  L$ b- u; I' Y* T" M, X
use postgres::{Connection, SslMode};3 Y- W$ @* q* N5 \% a* G
: x# q  |6 v; Q* {4 Y" F, u1 _/ A: ?
fn main() {, z! p6 z% B7 q" Q

) y2 }) V% q6 O9 @( k. q7 Wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 |! E2 ?. t8 h5 s/ k* o& c6 H6 y0 E2 b. o5 C
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();) x3 ^$ R" |  r2 K
1 G& T- \* n$ y& O; R
}
5 w$ [$ w- x8 m0 r1 f3 h
/ H) r' m! [2 x7 T& p! u' U4 v- \1.3 : Golang 插入数据: u/ u; U8 o) @# w. y

0 m6 I$ }  L2 f1 d6 Fimport (% N' _9 U" Z. p7 ?
& `$ }, v# t) d( F) g7 `
"database/sql"3 M- x* P9 O' _8 T9 ^2 F7 Y9 C
* ?/ W- U( `8 R% h! L
"fmt"
1 S$ J. }( B8 C( V- ?7 T5 }, Z5 F1 B1 J: j5 S% m
_ "github.com/lib/pq"
- X" z9 N& M3 K0 v; E7 @* [( [8 v; e* v5 `! L
"time"
4 B0 {2 Q5 w9 X8 U% w4 j$ v/ O; k8 m/ R: l. j
"log"" y" ]8 l3 W" l4 d& h; I: N8 K

5 J. Y: s5 e# A4 {' T)1 ?6 Y6 ~+ Z. z- x$ g
& D! \7 L/ K) ~: o7 ^$ ]+ d& W: M3 x
func main() {  G' u8 `7 ^2 f+ z

3 W! m5 d# u* R/ r0 H2 f" \db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")0 Z) w6 ?0 k; u2 B
5 ^) j0 v  e! h! s
if err != nil {# B! o8 L8 K7 S1 p/ v' p: s, o# w
( U5 f1 G' E) n# Q+ T: S" S9 M
log.Fatal(err)
0 K  O5 [; b+ p+ M9 M+ u1 X8 ?+ v" Y5 ^5 f
return nil
3 t# M4 Z9 k1 y" i* {) S. H8 L; o- d' ?' m% b9 r5 O
}
3 d# U0 A5 P( S7 ?+ {" ]' E, V2 ?7 _9 Y; z3 |  ?3 H/ k$ u
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
! ^5 d+ D! u0 ^' R# @- }" M5 U% C! Q: i4 o7 U# w4 s! |
stmt.Exec()
) X1 z* t' z* t: U3 _" ?: i  C
6 J( d0 V; w( p( I6 e% \stmt.Close()
2 Q- H2 S5 n7 ^  w# f, x3 c8 A9 G: }0 w  p) _
}
% p, F* ?1 r' X6 a% K7 e; l7 v4 k2 E1 j# ?8 I- E
二、数据查询 - SELECT
# |9 X: A/ x, f1 y7 q1 y- G: Z
4 V  P0 Y% W  ]2.1 : DLang 查询数据: L, B/ u* X- f8 b4 `3 s5 P
: z( k. F! z) T8 S8 `# Y
import std.stdio;
9 Z3 C7 d! w( H" H6 Z; e' P
& q( c' c% Q# b* m/ {import hunt.database;
% x4 Y. h* P# V- q
( r' J% ?, ~' U7 B/ Gvoid main()# O0 l$ F8 I9 t: \

9 Z1 @, [3 a" q5 O, ~2 `$ t{- Y: Z) ^$ X7 I' `2 ]( K1 ]

8 o& s3 U( L* I: l5 b! ]4 E: r: ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");* D1 s. D4 f: N9 a0 n, X

$ U3 ?8 D/ J8 ?% {1 ~foreach(row; db.query("SELECT * FROM user LIMIT 10"))
) A/ N' K" J& _7 l# `" `, c- Z) r% I5 h" Q0 z
{
! \8 @+ r4 X, m9 I- w" T% X) G6 a6 ?  A% H9 i: y& x
writeln(row["username"]);
$ B3 h) \" U& _' W" ?
& F; j( B4 u: \}) Q5 h, z9 n1 Q# ]* `. m
- I! F8 ?7 d) f4 ]# t# {/ K
db.close();+ x. e) Y3 u. V' L8 `
' k3 Q. A5 A0 i& T
}8 e$ s9 b- T1 a7 n' B$ }& o
5 E+ E8 d8 P& R1 s3 Q, z
2.2 : Rust 查询数据
. _5 C3 Q; F: m6 T$ G/ ]$ q/ i9 d9 a- J( Q' I
extern crate postgres;
1 l: c1 J7 q" q2 E- o$ U- c: F, m. j- P5 G1 }0 X  M
use postgres::{Connection, SslMode};
# [# ?0 e: i9 t9 n) [* P1 d# Q2 a- h8 [& }( |8 s
fn main() {3 T( w$ a5 A7 m: D7 r
2 c1 l; V  o7 P  R
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();8 L% K. E# H" h% C" P

' J# ?* g# `. A# D7 D& _- Ofor row in &conn.query("SELECT * FROM user", &[]).unwrap();  s. F% v1 B( @+ G5 q9 y4 \
  R; u: @$ ^& {8 p6 n5 P, w
println!("Found person {}", row.get(0));2 G0 v0 n5 q1 E( w( \) \
! o$ a) A' k0 o  y
}2 C6 k( B  j6 @7 d" h8 [' L
, O/ |% g/ ^1 H  O
}
% @) f2 B1 ?+ @8 i3 I3 k" p* {8 `+ t6 \% I
2.3 : Golang 查询数据
7 P& @. e; W8 _, q* s
9 R0 c" ?5 h+ h( Qimport (: ~8 Y) s, E' S) _% W2 H

" b: B9 B! C; t* c+ K"database/sql"
- x" X/ }5 l8 @  p( n  F$ V/ {; }& q$ D0 K0 ]
"fmt"8 \; @1 u1 q6 I4 v3 Q% G# A
7 e( }1 \0 t- ?  F
_ "github.com/lib/pq", t2 i$ I! [/ w. F& b
# I) q! n% s3 T% ~8 `! S4 Q
"time"
/ [$ u7 d- U# c: d5 C; j
" b2 T# P, a* L5 [  A"log"3 B" i# O+ ]+ B7 o% u

/ A: L7 \5 k1 G% j3 b7 m)
' W8 r! d/ W' L: o
+ S1 y1 D) j! K6 t4 t; X1 ^& W9 P# U8 ptype User struct {
0 q$ q) b: T# A3 @% |
+ ~* g; d, a, t8 [UserName string. w! y. Z8 ?" g9 X# i# d2 @; t; q
/ \2 L% @% H+ E" y8 {. s
}
+ @8 `9 n* m; x4 g8 a0 Q( _! m& X; p7 z9 ~9 C8 e9 j
func main() {9 c* f2 E8 d/ |! g

- U- t4 J  T' ^( G5 V1 n- v$ d5 Idb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
( m2 R; r8 p  M/ R0 l2 V5 Z
* x9 L" @+ n: }/ \" gif err != nil {
9 @3 B* l- \8 a, g$ `% j2 a
; ?5 X$ r2 t* W+ V  L3 P/ e5 Plog.Fatal(err)) n3 {- q( g) q- K7 Y- C- E
- x1 c7 J: {; b% h5 f
return nil
& j2 v3 B, }" `- v" C9 h$ p/ Z( |6 G4 C( w  a0 e0 a  P
}' ]6 z5 v1 C" |0 }) z7 X- p

6 f6 n0 ?" x" [# z+ L3 m/ xuser := User{}; r. r9 T1 M- M5 x3 B
& E( X/ p# v8 w
stmt := db.Query("SELECT * FROM user")
$ f1 o8 d& h$ H1 C6 @3 V7 c3 k7 H$ @: h" j' E% p" R
for rows.Next() {3 S, h  J8 x$ Q+ U

& {) u9 V) F: t) O( ^7 srows.Scan(&user.UserName)# D5 R+ P8 b- W) c- W& _8 j9 i
$ A! I0 J/ t) q: M/ m
fmt.Println(user.UserName)  m+ F# P' L+ |  `7 v  x. N; t8 M
% m" @% F5 |% X  k) T% W
}
1 [% k2 C: V3 g) U0 Z' ]6 e- B% F! _+ O7 w# x  c( H7 [
stmt.Close(). I4 K- ]; j" e9 |

9 [# q6 |9 i* l/ I* t) v}& m5 c8 z0 U" K8 i/ t; q7 i3 O( r
6 n8 ?/ m7 R# _6 [, e; ^1 d5 U( `
三、总结' `0 c. M, A) f  q  S
2 r: w$ {) T3 ?( c& v
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。* i/ i  f# u2 I3 ?) L7 S

; f% h( W1 ?' F& y这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
# _& w5 T0 R( F3 A! L1 H. c( f, X! m9 F+ H$ V" t. r
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。7 U/ [( C7 Q/ e

4 G3 U! ?( T# z, V* I总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
% P  T% G* m& |0 b————————————————
* ~/ `) x' g  N! x1 N  t/ J版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 f1 ?  D: H" D6 U. c# l- n+ k
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961+ Z; ?7 g' a" I! N

1 O; d+ d# f. v% @




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2