cncml手绘网
标题:
rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
[打印本页]
作者:
admin
时间:
2022-10-26 00:48
标题:
rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
# v) n7 W3 G7 j+ S1 p8 V, I! e
: E; _# q7 [ z& k
一、数据插入 - INSERT
8 V* d5 X4 ^; Z6 l1 d
" ?5 K+ d# O% r/ U! a0 G/ @1 A) P
1.1 : DLang 插入数据
; s9 q, C0 F- U% {
4 H% z; |: _2 y
import std.stdio;
, u2 B* P1 o! g* A
! x: D; s; |# b" I& C
import hunt.database;
6 Q1 @0 {; }5 r) _: M+ L' ~
5 T1 R; y8 j% P1 j9 q# I. C
void main()
$ U/ c5 {' \# w
* V4 e. ?3 T+ J: d& \ f
{
# M( M C. n* i3 {* f* S0 e
2 P; {2 K1 V# y9 K) }1 V% b
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
: f4 x" s! D9 a6 t4 s* a
! H- D+ n8 M4 {- b1 r
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
& t9 q/ X* b7 q) N. @
- \& H1 k7 z- W+ D9 t
// 打印插入数量
" Z0 m# V: u, o. V! w5 ^* @) ]7 _
" ~) @! ^+ C- O o( Q
writeln(result);
( E/ @8 E6 }. M, ~( I+ `$ L; F
4 a- M: U) F9 o+ O L
db.close();
( {! u( F" C- D/ n/ o
* c ]# k! U9 D! K
}
: E' @: m- ~7 r7 q4 V
8 r) Y8 C F) f; Y F+ c" J0 R
1.2 : Rust 插入数据
2 @9 K" r- {/ A8 B% v8 s- S+ h
( V, x% R+ p. s% I: ]
extern crate postgres;
8 E- t/ q/ m$ a' O" v; Q
% C7 M9 e; Y4 L# c
use postgres::{Connection, SslMode};
; M/ v# p. \5 d
$ u* I7 b. T% |' @7 _* m
fn main() {
# y- \) X. {1 N" G k: ]/ |
2 ~1 W4 P: z7 f! C. d" Y
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
* N% Z; ?( Q$ r$ k U; ]
! p) _ f S. }) u, W
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
) G5 g( o- x- _4 o2 N& d
+ m4 b% S( L" ~1 ?
}
& a; p1 q( s+ c
7 M+ K. T1 ~4 c x( W
1.3 : Golang 插入数据
! D, v, J8 h8 A
( b' R P, e ~! `; s: F& |
import (
: l6 U+ C* x& o: j; Y3 {0 b2 w
/ G: d' J1 J3 D8 Z7 M: `: R
"database/sql"
+ e9 j W1 K# Q7 }" t- c/ w) {8 m, m2 G
, O$ a. Y' @% f n1 O- _6 _2 l \
"fmt"
. a/ k5 l# W0 M# M7 A/ n- s! q, V
- n$ r) s$ d8 m& ~4 l# N4 n
_ "github.com/lib/pq"
* B3 w2 t: t* N
4 {* S4 O6 Q& }* n. r* U
"time"
6 Z8 C5 F1 a% y- @# H
6 z) J0 q6 D" T' Y
"log"
7 E. z$ e1 G9 Y" r+ \% [3 j
/ H$ A" ~+ Q: Y" U2 l# g
)
3 \$ Q5 v' T0 `
' ?7 C, x: h6 \) v2 ]( G4 z
func main() {
6 l6 `9 O; h2 S: P. @2 B
' v. R8 A% ?4 T6 B/ P; _( {2 P
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, T1 b* J8 a F& L5 C6 O
6 g1 [9 K9 g6 @9 E) H& o
if err != nil {
' U! ]* }! O* z* s' ?0 M" V
( F' z& q" d, E! a
log.Fatal(err)
' I$ z9 F) Z, ~$ ?- |
9 a1 o8 R* W! T3 s `. h
return nil
% }& a9 f# |; x& H9 B; r. J
; S5 }1 ?4 V* E: W# i* @9 {) O9 @" e
}
8 k; F" u8 s) w, W9 c
) [4 R7 A! h& ^/ S
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
" w4 o: ^) \2 J8 x, j8 [
$ f' ]5 o- G8 h* Y1 Q6 q' y4 V
stmt.Exec()
% F$ T. |4 I- C( d9 b+ y' J! n
y- F. e b( F
stmt.Close()
1 m' ~5 X/ c3 K, W. M
% C4 u7 I# }! h
}
' [& N% |0 ]! y3 o/ M! j+ s
+ Z I- R' U, t! w# P+ j6 l
二、数据查询 - SELECT
+ {7 t$ Y2 n' G6 k6 d `
, K" {' a9 d& ^' D" c
2.1 : DLang 查询数据
7 p) S3 Z$ _" N0 R
3 {, `- g" V; y% v
import std.stdio;
6 R9 i/ E& B* k, h) k
, q1 ] O8 b9 x% P* P% T2 l" j; n
import hunt.database;
2 X R6 }; m% H" c/ J: r
7 `/ S# m. L7 ^7 T. S
void main()
~+ \9 g9 I5 M. U$ A# @
3 H! G' i& W& C3 R+ Z4 ]" D
{
. |3 {+ L$ v7 P) {! A* R
) y% o; N8 H L% Z; {( q- U
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
Q/ i; ^3 Z( {
3 S. x S; W/ n4 w" C: I
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
2 E9 R `2 m& ], {
( u! `5 B: Q/ l, I2 n9 e
{
/ z+ d, |' z, o4 o( U3 C
" f0 t# G- p' y' J
writeln(row["username"]);
: C3 B6 p$ Q# m) X* N U5 B7 s
{- g+ {: i5 e5 i7 W
}
9 _ M5 g) F+ K9 D, O1 h4 R1 F
1 |+ n+ \" \" Z$ |. t4 i( Q
db.close();
: c t7 U" }2 P7 ^
k* D9 b5 L# z
}
& z5 w& j- B- {
5 H6 C6 v/ I0 _6 d( f0 _
2.2 : Rust 查询数据
* e, a- w: s$ F& v
% d, R1 |" q+ d' h
extern crate postgres;
2 I% V: g7 z5 g5 A5 w$ O7 r0 D3 H* f% |
, y# T& v8 }3 v
use postgres::{Connection, SslMode};
+ E# D/ A$ J5 W& p! M; k
! {+ I9 P& I' v" t1 r: C0 e8 ~, _
fn main() {
6 j4 Z+ B3 b+ r/ _" P s/ Z
" N" t p& P' S* C3 J! B0 G
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
, O* I3 p% n! s! b% y" F8 i
/ e8 U0 M. d; p
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
: @, y0 F0 S3 a J3 |
+ e! x3 W% s& Z- ?* E n2 Z
println!("Found person {}", row.get(0));
2 y! P! D8 D& ]# P: m
: g/ t0 u+ |2 g0 ]% f
}
g6 u+ \4 p) \' z* I5 P J
3 ^2 C* [- S2 O) x
}
( t. R5 y) ^; S2 u1 E5 I
( p7 H! w( }" }- O. @1 @
2.3 : Golang 查询数据
/ t4 x, R4 |6 q% j! y% U: g6 [
1 j/ J0 z. c( s
import (
! N& j |2 c# z& w i
+ s W1 L% _# e1 t/ ]7 |
"database/sql"
; e+ Q/ a4 o! R8 d2 M
* Q- m2 C# Z( u2 P0 k/ D# `: S
"fmt"
* @) b1 e2 ?6 Q, c9 l
! ?9 a" a) u& Z, p
_ "github.com/lib/pq"
6 X( A7 T! m; @: M( r7 w
; q% j4 O3 K; r: {' i
"time"
3 l( H+ y) n% f6 R4 [9 |' i& e3 A! r
$ s+ }; ~ O/ G+ V$ I
"log"
. c- o9 b3 |# b) r
" S% g5 R% w5 R7 s: p
)
" t/ n* h3 k. R" S9 _3 l) S# r
* V9 P' h+ v0 f. e; f" h6 g: f* w
type User struct {
7 p6 f: {* C H# m- f& v& N
9 [! h; q% ]2 y$ T9 M/ i4 h
UserName string
1 C; g! E6 p |% `+ f0 [
& ^$ A$ I3 V1 R) k+ D
}
$ ]8 w" }( E$ c* R# N
, u$ S1 W+ n( G3 J
func main() {
9 o5 d! h1 j5 l. D
# j6 z8 y' Q2 d2 ^
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 ^6 o. h' M% l0 x6 Q; e
+ l0 x* { i- G9 k
if err != nil {
1 M. c! Z. Z) W5 s8 [: ^: N8 F
2 m) z7 T) ]; V0 n, x
log.Fatal(err)
8 }$ ^7 Q' O9 T; S6 u: A
$ r. p3 R6 {& G1 M
return nil
; P/ T' Y5 r0 l
, U- }( s( Q! J9 O8 w: [
}
# u$ _! C9 ~- \! u) e$ r& Y1 Q
' Q9 O& J) z# a" }% |; q
user := User{}
4 m, h+ H( T& a/ h( n5 A. f( ^
$ ] h' C" r6 M2 H
stmt := db.Query("SELECT * FROM user")
}: }. _, u2 d
1 y0 i1 p- w' E2 q3 }
for rows.Next() {
1 N6 E( s1 t1 M( @3 L0 V# d" p% N, U8 X
, y5 h: ]' K( b! X9 S( `
rows.Scan(&user.UserName)
& [! D) G3 O2 u$ W' p$ @- R8 T. | u
5 \, E+ J S1 K- V1 I
fmt.Println(user.UserName)
7 ?; k$ k( y2 ?
* ]7 _0 r* ~ I% ]3 ~( `' X- ?8 S
}
+ E* d6 B8 H! S! M' N' Z
. d0 ~4 E, U8 u) L
stmt.Close()
) x5 |0 C( S8 Q- l
# |1 e3 W- Q' o7 E
}
/ k* I5 P4 v) R# W1 b
+ m$ e* z' w& c0 D3 N8 t
三、总结
1 z j% v0 X' k- f5 ~/ n7 y) W
; N- m: g4 G+ h
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
?3 E7 i: i2 j/ |( J+ {0 r5 {- M0 B
& ~/ Y5 @- Z3 k9 L9 ?" Y6 g
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
- S r8 ?9 v0 {6 A5 g
5 ^ _/ C2 D% j7 t, b
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
# z4 l8 g! C. Q# K
9 F9 m2 m/ L( ~* R4 B% A! @
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 Y3 F, A) H$ C& l8 K1 M! p
————————————————
: [3 e* _) g' [$ T! z' ~7 W5 A! o8 I! l: V
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% d: F- ?" ~) V! a" o
原文链接:
https://blog.csdn.net/weixin_30713705/article/details/113633961
& I' W( G& k! H
6 }6 L4 l6 p0 z t Y9 f9 s" J
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2