cncml手绘网

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

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。/ ]8 {2 H7 w& K7 y$ W' x& j
! u" T. U) j- s  D; n  W
一、数据插入 - INSERT) F! V. O% V7 _: t4 B3 g
) ^% O* j. U& H
1.1 : DLang 插入数据- Z$ R5 p) _4 o% Z6 O3 d9 A

! ?) m4 M- ^. q4 O% Gimport std.stdio;! G' h9 A! `: C5 C, w6 v$ l* g$ L

. b( T3 ?8 W. c1 U- V! ~% Wimport hunt.database;5 X0 b' P; s1 f1 |: g/ j

* W7 ~7 D- L$ K# m' l1 D0 w; |void main()
% n7 B; m7 A, {8 |+ |2 r
! {$ w" E6 A$ `, f0 f0 m* M  ]{
8 f9 s/ i7 R1 F& j+ [6 d4 Z7 Y! T/ F: g5 |& L
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
' B6 Z% K* c+ k! A7 y: ~: J. A& G, c/ h% a
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
  W4 S) K1 n" U
# U  Z) x& _$ M( Q  k// 打印插入数量
% F5 R0 c! b6 e# [: R! L! c4 L! H! J% ~" Q: y) E$ B2 _
writeln(result);
( B7 u8 G8 v8 i/ ?6 O+ u5 d+ \/ ^  \! R7 g& P) Y7 h, U
db.close();
  i$ |9 ?/ u% z8 L3 h! |0 [
$ B+ L$ ]' t8 L4 b# s+ X1 B}
0 F% o" k- q8 p
6 Q$ W7 p! @6 N& t+ i1.2 : Rust 插入数据6 V0 G. `; }$ ~) w& d0 g

9 a0 M, g- Y  i- y2 `) m, dextern crate postgres;
# _  e2 c; |! A3 d/ C- _; j% f- Z
use postgres::{Connection, SslMode};
0 d2 H. W: L1 O9 g7 O% v( j' z' g0 X3 y5 P* r, d6 A' \) h
fn main() {$ t" ]' S7 M' A) T+ x8 E
' X: L& G+ B- j0 ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, S. e  Q2 I8 k0 ^  I8 r

/ L- Z" u( Q; {/ {" R/ k# vconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
; E; F% ~) D4 S+ N
0 T* e+ v+ B7 D}
7 v7 \6 O  L# B* f# ]  Y4 ^" `- k1 h- y
1.3 : Golang 插入数据
, f0 }7 ]" q( ~' ]* T. _& m! V8 ?0 I0 A& O. |
import (
, a/ k0 O( f8 G' Y9 N, e  o* s2 y! e1 D/ M
"database/sql"1 e2 y* ?' R$ \8 v5 ]$ J; Z. e
/ t& d4 H" H( q6 s& z8 G' \1 R
"fmt"( D2 @% V( n3 r
9 l$ K. o. D7 F
_ "github.com/lib/pq"; @( C4 S0 Y6 Q

5 o$ Z6 f7 q$ n0 ~"time"
; V" d" v0 T! X( y* P/ r4 U6 L9 R
1 @$ N' g6 H7 \2 @- t) {! C"log". a* w$ @9 R2 i/ w1 {6 [- }- F" P
! i4 ^; ^( x. |
)
* M2 ?% l( }' ~' u0 E0 I& y2 u0 H% q- m5 J6 B6 l: P
func main() {% R- }* F$ B. v2 i2 @
* Q5 r: D. k1 i2 }
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
5 m  {0 o' _0 |$ u
  _2 d3 G& `# g8 ~! `if err != nil {
) D- d& I6 F' w, }9 ^
+ s& f& a: r6 B: H/ y- ulog.Fatal(err), D/ h0 `9 Q) d$ ^+ F; ^5 P" J4 H
3 E' A3 y5 u4 |" N0 w8 o7 U2 j- a
return nil
4 o/ K# L8 L% A7 L% j
+ m7 R2 W  Y% M% P  W* J& @' e- c}
7 Q1 u1 j8 J0 z
4 s$ ]2 H* z3 j: y9 G' mstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
- z4 ]! |* o! b' g' X& j; a1 \* f+ Y$ _0 m5 r2 X
stmt.Exec(), R+ ?: S; q9 ^9 c$ C- ~6 G

1 M7 X* G) C' k$ G$ Istmt.Close()$ c; W3 p& \1 `7 \4 U
- }7 j2 n2 F' p2 p! m- ~
}
' W+ p0 s+ c  ^8 m; X4 m, Q1 ]1 v6 M! Y- S2 X3 U, W, F& w
二、数据查询 - SELECT( M8 j7 R4 \8 D/ s& p& ~! I' l

/ f' I$ p- ~8 \" ~. w; d2.1 : DLang 查询数据6 `" D; K8 H* Z) |/ m2 ~
3 R& k6 k8 G5 j# v
import std.stdio;  X+ z& R0 n# W' a) I5 L

+ d' W$ a0 u3 c) H: `0 _+ Rimport hunt.database;
% A( J; P$ T/ H1 a" v% b/ E0 e, o
void main()! S) c( K1 R& z4 l) G3 W9 l
4 u4 ?: _- T" o& g0 x4 B
{/ ~9 J/ n4 J" |" M" i: d6 \: t

+ _" J! `$ V  ?& u# Wauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
& h" m! \" D- d" Z+ q$ j: U) }- w  U# N9 I
foreach(row; db.query("SELECT * FROM user LIMIT 10"))9 ]! a  `$ g. r  J0 T

# N! v$ M$ d& S{: F4 J5 {; s1 T5 T
6 G$ X) Z/ q( a7 Z/ U" q( {8 D
writeln(row["username"]);
, _- j! T  u" b, ~5 s3 T2 ^7 {, E) M" N" u8 u
}
6 x( B$ m7 }  D9 w6 N
0 w, ~  y( A) u) t% k3 `, wdb.close();, z/ G. X5 n$ d  j/ N- k+ B+ s! r5 E

- Q5 l+ K! A% k8 W}0 n" p  O2 C5 A+ A/ l. `/ ^
7 U5 r; f7 ^6 b; ]
2.2 : Rust 查询数据
8 Y% X' `) t" Z7 f+ w( X, Q6 c. r- a* m; V/ }9 ~
extern crate postgres;2 x1 |9 T* Q2 ^9 B. j
1 N5 I2 J: @0 ^% d4 b
use postgres::{Connection, SslMode};
: l) ]( `0 |, A) m9 i: u  ?* S5 }  Z, R+ Q/ M% R  s
fn main() {' ~' V+ a  f' R) L$ d  V: r
0 n0 S/ Z: i6 t& A1 ~1 O
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 S1 Z* G9 X" i- g; m- s6 r
% X) W7 M  k9 X9 V# q. Y# x
for row in &conn.query("SELECT * FROM user", &[]).unwrap();& {& k+ ?) p3 G0 U( P
" V0 a8 ~" C6 E4 G0 f
println!("Found person {}", row.get(0));& R- w5 E" I5 v# ~$ P2 O4 q. C
7 f6 j1 @3 M) [7 Q( v* H$ s
}
! V3 o4 |+ i$ g" S, F
$ n" o2 K& R, S4 w/ X. n}0 m: r- N0 S: ^- J
. {7 q" F. g7 b$ G6 }3 K
2.3 : Golang 查询数据8 ?; H  E7 C" o/ ?. U4 c9 v
" [* b, M, d9 z
import (
; z6 s& f2 Y5 I5 ?
6 ]# d$ p' @# K& @) q- \"database/sql"* U6 v  t) u; s
8 ]2 s. ]# ^) E4 k9 h
"fmt": Z! p2 o( z0 Y7 Y  x, o

6 s" W9 Q( q8 J* C- T_ "github.com/lib/pq"
# b: S( O0 t' d% A- a
9 X3 Y; k6 A( h$ {4 U"time"1 V5 S' x  |# F! U  C0 Q
4 o4 [5 h) {( l8 H
"log"4 ?4 }; |; \) S8 A4 T

' Y! x4 a1 r) u* p* b* Y* q)' ]! J: A& ^1 E" l# Q2 Y! [

# b! v! g/ o5 H8 G  l4 v9 ^type User struct {
7 V: g% ?& d9 C" Q) R
' o# s3 f. f/ \* \) hUserName string
% Y4 }! V0 ^- e5 N6 g9 Y- l+ Q
. T# u$ h* [5 r}
: e* h3 O! ]9 W' w: s- ?
  h( n* ^: R1 K4 e$ \func main() {
/ [  b: A" K( X& x, e
7 G: g6 {/ [! x- xdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 S4 s. _! m$ }( j* A

  @3 C3 w- j- ~) {if err != nil {& p. j& S, J" `, f7 H" z
' X3 {# D# @9 w* o, z8 J0 w" {0 }+ `
log.Fatal(err)1 Y/ K9 P, {5 W) t

4 `7 i, j8 p/ c6 A4 preturn nil+ Z* l: |( j- h. w! J+ X
  L+ S( S! O# |
}
. W+ W' l/ S5 `4 v) {7 u  ^7 n9 g7 t8 K, E
user := User{}( ?1 E* Y+ L; I0 J* Z
# f3 W, ^: }* @/ g; R" K8 b4 d
stmt := db.Query("SELECT * FROM user")8 `' c7 z$ `3 ]9 o( K

$ y- A; h6 a8 ~7 o! W+ r3 dfor rows.Next() {: ^! ^5 q) I7 G/ w6 w9 w# @& A
* Y: r/ m2 y, K* e+ V% I+ k
rows.Scan(&user.UserName)
: I$ g4 J! H& q7 e: o) ?: n/ i; L8 m% ~2 o: n2 x
fmt.Println(user.UserName)
* e) K% D; F% p' N' ]) O$ R
2 F7 M8 G' G( _% H3 Z4 S}
1 X$ w, Z: _3 d/ Z5 p: L
1 d# ?. Q% ^& V# [1 W- Wstmt.Close(). }, P0 X) U; K# U* }- O
2 i* G/ a5 J! _7 e. t  q2 q
}
) {: P9 m- ?! o; M5 F. y0 P1 P: H% t' b
三、总结
# g$ P: j+ R! M7 x0 y- Z* z$ u& R# h( V4 @9 I" {
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。3 s4 G( z  W" L
. o- Z+ c( s9 |
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
: h+ T1 G% ]4 x( w6 ~
2 M, u' g# _% U在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
; r& V1 g: s8 |1 w* [- g* R" f# W- P- @$ x
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。8 a8 @& U( F# P
————————————————1 G$ Q- \/ x7 B/ \! n& E
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& `( W& W$ \+ y5 G
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
6 Y! {/ d1 f% y- o2 j5 F& t3 V* n- x' Q' j, ?





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