cncml手绘网

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

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。. x% F4 `$ r3 ^6 D
- E' K) {4 b/ F4 s
一、数据插入 - INSERT! C5 a# P$ J# Q: y7 V" U" O6 Q
. L1 z$ C9 @0 [8 n
1.1 : DLang 插入数据. c) s5 g3 ^5 F$ X( u5 E  e
( J6 f5 ]& T* z# Y! {) w. X( q
import std.stdio;, c" r7 u( Q% X  V5 F4 H/ |+ u

" d0 e9 g- N! t. J9 y" {3 Jimport hunt.database;
: z3 u% Z9 _9 S& ^: a
0 W) s& Q7 X; @0 nvoid main()# i4 o% R$ s9 O' Y
! x$ d# L% Q# t! }
{
3 w  }3 w( T, t. l
9 K# M% h/ J) K, H7 b5 B7 [. `9 Tauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");+ B! E( E6 u: V1 ^0 J
6 @  o; x. V# Q5 t
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
- s: P- m1 v5 I8 u6 V
% V3 {8 s4 M  s. g; E// 打印插入数量
: n1 _5 _% P) A, l# y" T$ b7 d  O+ }  J
writeln(result);
* @& X0 S& `/ I$ Y4 S+ A5 `8 @' e, S% ^+ f$ W1 C
db.close();2 |' g6 K& o; C" i3 ]$ T/ Q1 `4 L

% g: t, X3 b& T0 i0 j2 j& e% n' `: s}+ q& H% _! q- k
$ M7 W% x1 e% O5 l
1.2 : Rust 插入数据
5 v+ r' ]+ _" J( A4 R
0 l9 B8 t1 m. ?4 H3 h1 g& [extern crate postgres;
  T) E" J2 t' m$ Q; D* Q# }
* G. a6 x' F7 M! C- C; E: J; L: Muse postgres::{Connection, SslMode};
2 t7 h, H! X) z  A# N9 x& I5 ~9 j7 d
fn main() {
/ u/ w# N! w( a, l9 @: O& N% d3 A: Z8 Q5 J0 E% V
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ N9 ^9 O1 x7 C* H8 K! \$ w9 r  a9 y' E) p5 W* x. }: D6 x1 U
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
) f% M* v! I2 H5 V8 P4 f- O, r3 s! d, s8 v! v
}  q/ G, r( p/ l' O' N4 ]
9 z% l' s* ]% t7 N' k( ]) Y0 ^
1.3 : Golang 插入数据
- U  @9 q2 {; n" @3 V- F. K, F5 b6 ]8 p9 i$ L/ @
import (6 J' w8 }. W+ t7 l

. f% _$ s3 S9 P, ^* a% j9 p"database/sql". B  z% ~5 q- Z: k% L
' K9 b( K2 ~8 ^2 x7 H
"fmt"
5 x# ^7 w9 `/ j' r; `" M2 T5 i0 V9 F9 a5 J" ~
_ "github.com/lib/pq"
" e1 m; y' h* Y7 N, M) g3 ~4 O% \  Y; b% c
"time"
; s" B6 q1 w0 o" Y3 a  Z  w8 A7 o
# M& l1 ]% z& m) y; }"log"* h) _5 z  J! ]1 {9 n  v

+ s: c! Y: U  `1 g7 t" K' t1 {)
3 [/ l. g1 Q2 {$ Q# c, u+ L( S
( m2 Q. h( j  ?. G: m3 B& hfunc main() {2 U2 u8 {, C# j$ f" z
# L" M) o# }( }$ w, W! J
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")# ?/ x. O- o+ X7 d; ?1 u; |
/ n, t" j1 U- y4 y% G
if err != nil {
- d( B' I1 U0 }) p/ d
8 B& V; ?& R! g4 @$ k, s" e" U1 Flog.Fatal(err)7 {' n7 f& ^3 n. y5 `% @6 s+ y
- C  M, v' i  ?: b% j
return nil" z* J* F! y9 q$ O; a

  q6 \* f6 Q% Q/ K7 Q}: ~4 d' @& Q! K  u3 W: A* h
, b) L1 ~: \$ ?
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
1 G6 ]2 F' Q5 f- b; c0 n/ r( F- G8 q( M. b  J/ B
stmt.Exec()
* ?/ j1 p# d9 D* m- P; B. h/ ~6 ~3 Z; b" M" s
stmt.Close()2 q8 `6 B; h/ Q$ a' u# j

& t. G/ c* q0 Q3 Q}
6 D0 p8 r( ~- g. F) n
; _9 ^* r5 m2 ^二、数据查询 - SELECT
$ H; S0 a8 k3 ~  r( \; j4 b; Q. W  D3 z" Y* G6 h  O. m% Q( n
2.1 : DLang 查询数据
/ J* Y$ m) F" P  k) l0 T
' v) U4 V2 L' ?# G, v& X" _9 _+ himport std.stdio;9 N5 ]* A/ ?3 y
3 C% f* l* q$ f3 d6 ]2 v1 e$ w' H% C
import hunt.database;
1 `: n6 X0 d3 g+ @+ M
+ A4 r+ i/ W, ovoid main()6 F& E- U" b5 [* O, B

4 D- H5 a+ w7 K! K{
( Z5 E- `* M  O4 q* T
; A) d7 j4 L. b$ R7 X8 i  gauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
9 q* M' W' O9 t1 G; F+ g" V5 i; r3 a0 K! s
foreach(row; db.query("SELECT * FROM user LIMIT 10"))% h: z, T7 B  e2 d+ q) B  z
" z6 Z" b9 K' v5 W
{4 \$ E2 a; i  U! X3 E* X6 P1 A' f

4 F0 S5 ^/ |) {; [, {& K2 z/ jwriteln(row["username"]);
8 L# Z, L" u) Y  B8 D* u! g' O* {( W, x% ^4 C( V
}( b+ \$ v' o" F) F6 Q3 I9 V
  T- k) k* \8 i5 i) Q) C
db.close();
. }) N* \. M8 m! V+ _
: T, o+ h# d, Q& _}0 _# I5 G& B6 c* D- ?

9 ?3 y0 i$ t' f. Y7 z! K2.2 : Rust 查询数据
8 m) ]) Q2 g9 i# ~+ M, z7 U0 \2 o( n6 |
extern crate postgres;
& r9 j4 S/ b# o) ^2 Y) n6 X3 L2 f+ h7 l* ~
use postgres::{Connection, SslMode};
, m( Q( V# R- Q9 v
+ S, E+ K% H% Z7 C" b- ofn main() {7 F3 \' a7 v* j% [; V0 k+ m5 E
$ j: S- f! w8 ?6 j, [8 ^
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ V$ Y* |3 E* r: c* H7 t8 d
. A8 I6 O# o& C0 e2 I$ D+ Z
for row in &conn.query("SELECT * FROM user", &[]).unwrap();5 I, W% e/ S: D" D/ a0 _
9 M/ H- u% D) C7 Z- a
println!("Found person {}", row.get(0));0 D7 y, G- V- B$ F1 `9 e" F$ c& i# @

( x- J3 h3 q$ |. A- p4 L}
; Z5 I/ m- I0 v  k) ]/ U
9 }/ L# J9 h% ?8 z: G}
- l! `( s  D/ W+ b" V/ |6 r" {) t
1 o6 m0 x" X* s. [; n2.3 : Golang 查询数据1 X2 |$ ~- H5 r0 o

3 D, F  I( `  f/ l% [! ?# m) O& aimport (  E& m5 r# g1 ]! z$ g

; Z" Q& T7 Q, i3 b" N. F"database/sql"
$ h& M3 D% C1 L8 y3 B% |: |( _& l4 S+ N+ ]& J3 ]2 x
"fmt"$ e7 z; A7 r" Y% L4 a1 F

2 a! A- t8 B, n0 I* x; [_ "github.com/lib/pq"
5 t4 R" Y- T) t! r9 D0 t, L
, ^+ v8 o# ?; X- e+ _8 v"time"
6 [! L* t/ |" m  h: j! R% ]4 S% [8 [9 \
"log") p! z( |- F2 s4 }7 C" B) @
; x/ ~) N9 `& H" [4 w- J4 g/ C
)7 l7 `" ], ^) P* [/ g0 m. F

. F  y- X& t! ^+ i- p2 @8 P& Xtype User struct {
  ]6 }* z: ~" o3 q' ^# Q9 k+ T: L$ E! _
UserName string( ~8 L) a* B4 J
3 y9 G/ D6 I  t7 |* D- i
}5 L$ Q) n, a8 e# }
. ~( G. T; b. `+ H" p& V: \) @) I) K
func main() {
/ a" u' b' Q4 a$ p5 _" {9 z# ?/ n
: K/ t  Z1 c& i; }8 Rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
# M$ `+ a1 J! ?6 G
) P( }- z: P% q0 c2 pif err != nil {0 Z+ f7 Z4 m5 a9 ~1 B. ~8 o3 y
; W6 f8 @4 A9 z
log.Fatal(err)
& F" ^1 m, Q2 |0 j# T1 H( F$ F) C8 k' C& s
return nil$ o+ C! s( N/ Q% n  l0 B

- T) u, u. r4 [- a* A}
2 x0 y/ \4 d  b6 B6 i5 Q& _1 e' _/ J) B9 j1 A* R( Z/ ^6 z1 C
user := User{}
+ x+ e' y8 P: c" ?; D/ {( y
' T( D3 y; K& r6 X) X' ?% ^stmt := db.Query("SELECT * FROM user")
' }* N- D+ V+ n. N
% Y) J- |. N) S/ d$ ^for rows.Next() {
9 h' o9 V) u3 U' K( j# \
& @, N) Z9 E  y" c+ \/ [& ^rows.Scan(&user.UserName); N+ h  u6 C0 K/ E) I7 d
4 F4 l/ W" S4 E4 W% I8 i
fmt.Println(user.UserName)
6 s& \5 e# ], S- D1 i1 c
+ q5 b4 R; p! U3 }}+ R/ Y7 l5 u6 }- j" @) h

! T0 Q$ n4 V6 h; e/ estmt.Close()
2 q. x5 Y3 E1 V; }( Q8 s9 c1 W8 Z) _5 s* h1 F8 N+ N6 u4 G, d
}
) `2 g9 \) S6 h+ t' n2 ^  S- Q1 c2 S' ?( R% |; [% _& G
三、总结$ u/ {5 Z; {6 L$ d, a5 _8 f: z

1 @4 ~( n' Z  k0 G6 g对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
' t' y  w& I3 ~6 z9 u, y. ?
2 k0 l' N- M2 h* |/ M8 H这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)% K4 f- q- q1 ?- _5 b/ t
2 a; W; }5 @1 `
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
5 J8 ^2 [/ o5 ]2 _2 F; h1 E. {- S- l& L5 ~& y  O! R: {: J
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。" i, _2 T( t+ w9 g& [: H
————————————————
( ~8 W1 l& P/ }- U2 u4 G9 Q" D版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 O$ ?2 X) b0 R+ q原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
; D$ U, U2 v5 @
$ r, d/ W# ^( x9 @




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