cncml手绘网

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

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。9 [( V$ g3 b, ?) ?

% G3 v4 g7 N/ L一、数据插入 - INSERT
  I, E+ @3 I+ {6 @6 Q6 h% v6 t' Q: o$ r# i+ @& w
1.1 : DLang 插入数据8 l, G" ]9 @% V

  v+ K9 _% P7 ]4 Yimport std.stdio;
6 Y: j) B8 m+ l% s8 J1 |
1 [( ~) S- p+ Uimport hunt.database;
* n# w/ f4 g+ `
  Z+ B  g  X' l" {$ [6 Ivoid main()* \% S$ s. z' r4 ^  S' ~% [- c

" @; E) O, ]7 b$ p7 f1 ~{6 E5 f- b, F) B( T

  |' p6 P7 b: @9 B5 {5 Fauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
# D4 h+ `1 K- j0 ~. \# h/ {& E, L) m$ B
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
& F. z% w: M, }1 ^& [/ ?) ~  k. ?0 j1 d$ H1 b
// 打印插入数量- J, b' l" _5 q5 M& e: Q

  }, K0 U  k4 [' A3 ?writeln(result);9 @' A* _0 N$ r6 `$ d% m

. ~  H- w5 x1 Qdb.close();
& O* R, z6 v& Y: ^* V" V3 G% t
9 u! {9 n! x& Q/ ?. y}9 M1 _3 m. ?/ [. g: F+ B
1 a, J" c* A" W+ K1 j
1.2 : Rust 插入数据
. p' k) A% X  j- ^7 n
4 J. }* }$ ]( V8 Pextern crate postgres;# z" R; g1 S5 f
+ w! Y; y$ {4 b
use postgres::{Connection, SslMode};
4 U# v: i% k: p! B% V+ v( _6 Y! M! F# U+ Z: a  l+ y! N
fn main() {
* f$ Y$ N- X4 N9 V" `+ K! `6 G) j
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
1 T% i/ Q+ y& Z3 C
5 `6 \( j9 _2 Z$ m, c3 ^conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();0 C$ C7 C0 U0 ]. i
/ U$ d6 s1 M; Q8 v! |
}4 V* q! J9 q/ t

7 E% g1 S% J4 [* `, `6 G: b1.3 : Golang 插入数据
: Q" Z$ S! T; [8 x( _
6 D1 l1 f# ~& S4 g% R6 d- k: b7 Rimport (0 u3 ]' L% L" V! w) i( ~! U6 `- a* I

* m4 P7 O9 o: E4 H9 ^& _"database/sql"- {! K! N8 ?1 ]! `# G

: z% Z/ Z. u" ^  g* ?+ ]"fmt"
8 ?4 S1 p; F  W! j- O$ H' u0 g# o7 X# J) }5 ^! @1 h
_ "github.com/lib/pq"
  u4 g3 a$ o! K
  ?$ S0 o$ O$ a7 a2 y"time"
1 U# k0 S8 C  X0 x6 M$ x) F" \2 x. |) W; L' r
"log"
3 f) y, z6 K, {" W, m, |; j6 Q4 _. {
8 A# y4 }% _7 }8 D3 ?( b" o)6 s, L# Z. D0 j3 @
( t4 v; h8 L; C; l
func main() {
2 x, l4 H! X2 z  e, B# ?3 J- J4 C% ^" a) u: p
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")& N9 ]# ?# S4 u, e1 m
8 p0 D$ Z6 Q/ x3 C! z; P( U
if err != nil {
$ ~& h0 `$ v' K: S- z. x
$ Z: I: @9 D% glog.Fatal(err). o% l0 M* p$ i5 X+ N
7 e3 ?) {5 u4 s5 v
return nil. W# H6 n# C! E  }
' K' A3 b, t, \7 D. V8 B" U8 g
}
2 y% b0 q) j- r/ q7 D& f* z: A6 y) G5 ^
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
# e. ?# R1 s. K$ w" t$ Q4 ^' V. Z- n( E
stmt.Exec()! H3 W& S9 K5 ?$ n/ E
8 q, D9 Y: r, F& `; X- c" `
stmt.Close()+ N( j* i/ o3 ~' b( S
5 e" p7 J2 h! t! m% c
}
) l) f0 f% r$ d; {0 a# T1 J3 {4 v+ j! Z% C/ V! A$ K
二、数据查询 - SELECT
. N  _; G- t' @' a
9 p9 {# O# G# O* L: z2.1 : DLang 查询数据) g$ K' X$ |  k  C1 t* k

* \% X& Z1 i% N4 k( ]' V" Oimport std.stdio;* k' b( t+ n: o5 A: P/ d

( G7 W5 K! ^2 @" N9 Eimport hunt.database;; l6 C! T( A6 |6 _
, u& f$ S$ S; l( `8 s
void main(); ~: |, D  L5 L( V& z3 m) i
" W& J9 C0 T0 z
{, {  P; i! P, S9 X2 X. T* Q
2 }% y) j- ]. A1 E; N
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
8 E9 e* ]6 v8 s- s$ x% M& p7 S& V6 B! V/ D
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
: S2 }; X2 m$ g# V
/ @9 e& N7 S" F# \/ X+ p{
9 r) s) Z1 u- {* {. m8 [
, e+ A; ^9 i9 D& }+ x6 f3 \/ Q7 O1 dwriteln(row["username"]);" w6 t" }" e" ]2 o

( d- G4 n) J5 M) ~# g+ A/ ^}
3 m# ]. |+ e5 N2 Y2 z8 f
/ x0 \- w1 D. T; p! i) Q# mdb.close();
) t2 c! d; d$ J/ c2 d  r
0 h! S8 z' e/ o1 C( o; j4 p}3 w4 A6 q+ F! P, E) d
7 w- L) a! G9 e& c3 @' P, U3 H) M
2.2 : Rust 查询数据( u$ T( G  u0 J

6 [6 v& @( s8 f4 X$ _, f" j4 y' v3 Aextern crate postgres;
% \8 r; J+ o) M' r
1 Z# s$ u7 e* n" huse postgres::{Connection, SslMode};2 V2 X+ V4 Z! j8 @% q4 \2 C
2 x" |9 j# F8 S9 O* K" o4 Z
fn main() {
1 N4 _$ K# G3 E# W5 l4 P% Z
0 X& ~6 Q) o8 y# Dlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();; B5 J1 W) @$ l9 m0 M: U
: T1 q* H3 w7 u; u7 H- o& v
for row in &conn.query("SELECT * FROM user", &[]).unwrap();; I* d' \4 P6 y+ ?# j' h0 w

) T1 i. _; }5 f" i1 V+ hprintln!("Found person {}", row.get(0));
( J2 d% \6 I) H- s! V6 `  [5 i+ g
}- X% m) k, _9 y! Y
! W2 J% _7 b% e- G% V4 Y# g1 o: p8 T
}5 r0 f7 H9 f, l6 N" o4 q

7 u$ m  h. S& N9 {. F2.3 : Golang 查询数据
: E9 [4 T* j# a8 {9 J: y) |# R% N+ O3 X( ?3 Z
import (
, g( \- E0 V- w! ]3 e0 G
+ R6 N/ f" U$ e9 m"database/sql"' E- n- Y+ O5 A  s) \7 k
4 u* }2 d$ e' _( c- o4 n
"fmt"7 Y9 ?; E) j# j- j: F' U! |. P/ c
# W) M9 @. O: L, \4 P& c" J0 I$ N
_ "github.com/lib/pq"; {5 y9 U2 B. O; q
% s& G( j- F1 r. v
"time"
" E) H; D8 A7 i
: c- K2 A( |% z$ X+ g' _. Q- f  l"log"- a, b, [/ w5 i  w( C& E- \3 Z
, f" o& E8 a/ t0 L) T
)' f9 E# F% P$ F
: y' Z& {6 Z2 Y- F
type User struct {
/ M3 M/ C+ I; |4 l% {, b
2 m2 s1 i8 E+ z- J$ pUserName string6 t7 y3 e% f% ]2 g
. q2 \$ R# g5 u' p, ]% a! n
}1 g' u- u5 |2 k: P8 D0 @! u
- z& X+ @" `3 l% ^7 n( v/ t
func main() {
% J4 o% J. l, @$ r" q8 F1 R+ x8 X+ I, T2 Q# ]
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
5 x; ]/ P# M  S* n3 A) M+ C# b. H  m8 e( W
if err != nil {, A  [" @; n4 b

# Y4 X; U( X- V+ G- O; u! k  Rlog.Fatal(err)
" {8 A) u, ~( \# @: G7 t  r$ g5 d
return nil
/ q1 b0 v; ]9 U( I3 r- M6 m, C3 X$ l9 z1 ?( u$ X; P+ P
}" z: Y) N6 t) F! O( S7 h- y
$ t1 [; U1 m2 z% z7 Y8 T( s2 ?
user := User{}4 n5 U! j  u/ F

' b) j" \2 V2 q$ I; y2 V0 Gstmt := db.Query("SELECT * FROM user")" d" s( b6 T/ H* k! u* c: P0 [
" L6 H# Y' _% G$ P
for rows.Next() {
1 x  x. @+ b/ x/ R- F2 t$ U! k/ r) D: ^- y3 C& f
rows.Scan(&user.UserName)/ w* s! W0 n2 S2 Q, ]& V
' u$ {; Q) E6 t3 O8 F
fmt.Println(user.UserName)7 g! y" O6 _- ^, @: }
3 f2 @) a& a* K
}
5 M4 y2 H% G$ }1 f$ x, W
* n) o9 V, k1 N% Y1 p( wstmt.Close()' H/ j) s# A4 V" Z# u
( A/ h( A$ H& }1 Z$ ^" v! W
}
, s* o9 W1 ^. c) s% \' _" m$ [. h7 J6 _: z1 Z- g6 \9 u
三、总结
# D% j3 j5 |0 Z
0 O$ Y5 D  M+ i; p对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。( X% l' \" e- I/ [
7 e' c$ j, Y8 R. S" Y/ q
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)4 {0 G: O, a: S; q$ ]; K
* x, t2 U' ]8 B$ ~
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。) I2 P" C9 P4 R- w
4 y- |7 C* N" k3 F5 ?7 K( E
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。7 T: `3 e* t2 N! b: n: Z, L' G* [
————————————————2 T/ F$ L9 c3 O/ J! G, \
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; m) I' M# G: m- ^$ j5 e0 I* ^
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
+ U. \( [* z, L1 @; J! T' i& ^2 Z4 E





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