您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4170|回复: 0
打印 上一主题 下一主题

[rust] rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。( ^4 G* s# `$ ~  G" i4 A& E
& C' J0 ]0 n8 b6 {
一、数据插入 - INSERT
: l; P& T# w8 O" A  c( U8 `9 v' x# m# e+ j. `6 u
1.1 : DLang 插入数据9 v, e1 ]. O% D; |9 A3 \* c

4 g# c. _1 d/ w. q# qimport std.stdio;
4 Y6 j! j' u8 k6 p+ u- I
  }4 Q' I/ o6 Bimport hunt.database;
+ c1 z& ~2 Z5 }. o" O* g4 i7 @) _( D% i- I, s" K4 r
void main()7 J8 u! Y2 J* _9 e. W- }) d. b! F
0 E+ d" t  N" y5 Q9 D* k$ g% U& ~
{  u  D2 x& ?( F! l

5 g3 Z+ w7 _; Q# {/ S7 U* P+ \* aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 D8 X1 d6 h1 d4 C9 H

8 B7 T7 @9 x' T" h  B* Qint result = db.execute(`INSERT INTO user(username) VALUES("test")`);$ m/ l( W# l1 a% i
  J" g: w& T# X  T% M* f
// 打印插入数量
$ ]1 j- `2 y& U' P
1 \2 z7 [- x# W9 r# H8 }writeln(result);
* \* X4 M- T; i9 \4 y0 X8 O; p. T; q- c4 k' w
db.close();5 v1 M- Q* M7 Z0 @' @5 n

$ B$ }) o8 T. m, \}0 K  H% ^8 D0 b/ D
, t/ B$ |! e  B* a. g; P! j# d' F
1.2 : Rust 插入数据
! e0 E! w8 o( o4 U8 o7 h
4 F+ R3 [( o+ n/ R6 @9 v9 [extern crate postgres;
+ `7 u1 U* q# y# K( y0 h+ z* d4 a, l+ ~3 i4 ^9 c
use postgres::{Connection, SslMode};
2 e" e8 w  y: o  T
' P9 o) D8 ^( h- x6 wfn main() {
+ B7 p- p8 [7 A8 c! U" l. h+ G
2 Y3 h# L, x1 ^. J9 |$ e, ^1 ~let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();4 W; `; q( ~3 \; D6 b
6 ~! `% B) ~$ f
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();3 T& a3 E4 k( Q

9 ^+ t4 ]+ |0 f% V  r}9 k( |' [: P9 E* H9 K- `. H

2 ~9 _8 K9 P$ ]  O1.3 : Golang 插入数据
% W% m6 g. G* b) _; j& x/ |. S9 h" {3 r, T' b. P
import (
5 ?9 K& j0 Y9 S
3 s6 d, [3 w1 N$ ]8 F"database/sql"
4 k: T6 k0 y; s* |7 k9 i6 t( O; n
* Y: T4 C% q* x4 p% H  o  R"fmt"$ [* r$ Z  z: T+ S( ^3 g* P

- f+ V. m& P: E  H* ~_ "github.com/lib/pq"6 i$ s# V/ I0 N* r/ Y) i
' t9 i+ `/ ^/ `9 B& g
"time"- ~% N- N; Z8 ~/ e$ e* o( Q

" G* {6 T4 o" e+ e" \, U"log"
# B$ A' U2 n3 |8 U& P
; k5 L' D# N7 w)
, p0 F/ T8 w/ V+ P, G) t
& j/ m$ p1 X. m; F  T! g- A% vfunc main() {5 V6 F7 a  K5 ?( j
& P# [( J  \# Q$ K. m1 I8 }
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")+ z/ l" _% q/ _7 E% a# Z) y4 ^0 C' z
; ^( w+ Y) R# R- }5 C
if err != nil {" ?' D5 @' X: I" d8 o  v
$ h3 _3 z; O" M
log.Fatal(err)/ R* K4 i3 U9 p0 E3 y5 L% j

# G, c0 f& ~! e, b; I! r! Nreturn nil! ?( x4 U/ H2 h. A" ^' p

4 C, o& q$ S  l& o}9 P4 K4 }6 ~9 ]0 Y0 C6 t+ d

, N0 G* P, [7 m8 Z- Q9 E$ Estmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
- \  e( M2 j( T; M3 ]& w% ]
% Y8 k  l" c3 a$ Sstmt.Exec(): Y1 q4 ^- b. M% c

8 }6 a+ j7 W& O# Hstmt.Close()
( w7 t9 u& X4 F7 G  @$ ]% r
4 n3 g) C; o- z3 p' ]}
1 I" U- S7 K3 e, s8 I# F3 r1 Z2 Y. L& P% Y; Q0 ^
二、数据查询 - SELECT3 }: }0 F8 ^$ e  p  X! `5 c
! [2 R  ^! e; W
2.1 : DLang 查询数据
3 m' X6 q0 I: r! X  a
3 Z) z4 W0 W( k& K) F, P. Yimport std.stdio;
( F& t1 s9 \& q, j- E$ K& z) y4 K0 b# W- F' t
import hunt.database;4 L* a0 j1 c0 G9 L

! |8 m, c4 N& v$ E  h. Rvoid main()0 ?* o2 _5 x+ Q) a+ K' q
% f+ D& o3 n8 ?5 b: V6 l
{4 V7 t) f) o" S1 c% i1 l% |& V
" B( _1 ]: q% r9 Q8 y- k
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ o+ ?* g0 w6 _+ C7 }" i  O, ~! g
- g- J) i* z. F1 w8 c* m7 E7 o/ ?
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, Z& S! v3 F& ~, E3 r, J
/ B0 P2 @0 m! }* K- b{
, N' o$ G. w" ?) y) `1 J% J, }+ S4 B
/ K4 D# P7 _4 |% ~* }writeln(row["username"]);6 y: f; k4 a' Q# \! y' c3 S. P

0 _0 |( b/ f& M0 k5 D( S}4 |4 O! R, w4 s( q. j1 I

8 d7 q) x, t. l" Bdb.close();
- r% B+ b. h! O3 n$ }5 ?+ Q4 A" }7 I1 g; m/ d0 p: [
}8 b/ R# S* D; E& O
& w+ d4 T3 p! _: q
2.2 : Rust 查询数据
% K# s" w0 V% E' @+ b5 D1 m3 |9 r
0 f7 F$ k  n9 ]& n1 M# G" Wextern crate postgres;
" G/ L" F( o7 ?) N% Y  A/ A+ W5 R& v& Y) `+ \1 F
use postgres::{Connection, SslMode};
$ _% U: u: j/ _" x2 m1 ^/ j! z8 l+ j2 K4 _2 @: [
fn main() {
# q$ R& R( o; G# k' n" Z( A5 U4 i  a
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
  f. y- g% O+ ?& a$ |$ b4 A5 `3 p+ w" g0 M# [7 ~
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
$ N1 `/ R% r; C1 L+ X
1 A1 m/ w% p7 v/ ^+ h4 Oprintln!("Found person {}", row.get(0));
5 `/ w; v3 H$ h2 m4 f5 b) p
- _6 i5 g# s" b1 s}
9 g# @' ?9 U) {: l: s% L0 q7 h6 Y* {# a, J
}( p0 Q! ~) Y' R
! h9 T9 S3 q* A4 Z7 g' e. k: J
2.3 : Golang 查询数据  c: z: _5 i* S3 Z5 |$ ^
/ N0 z( p& L  P; D6 k; k. G
import (
8 a; X$ Y/ j  w- N" E8 t" ~# C% c: [
"database/sql"% s  Q& }9 P! Y6 ^# t

+ z% e- e: k; z1 ?# Q"fmt"
! j& w) y: }8 B$ S* w* R& C. U) C, _6 T% o) @) I! H
_ "github.com/lib/pq"
8 ~: b. N0 D0 h3 V) L/ |0 Y) e
9 R( `4 R# k+ M" Y7 `9 q"time"' h: F3 ]5 S7 |! S) ], ]

# o: u% `& `3 K4 \) B' L"log"
7 |0 ~4 h. d9 y3 D% U6 g" t$ j2 [" r7 t& e
)
  X$ f3 y/ Z' o% L5 X5 f; |2 c# H- e! H9 J' {. A/ N4 O
type User struct {
: x: w) E' X  D9 y0 N1 l2 a: ]# j# ?
UserName string
3 X5 e, P' `' ]
! W' I7 ^; o$ v7 u0 k! p, A: F" @; i}
6 T; |' J5 ?% Z- h
! y' c, U# r- u- j1 h4 X; k6 ]func main() {
# L( Y& C) ]6 z+ [( ^& z# i( Q; I# ^8 s/ l* K1 \
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( _9 f/ L! d& J+ @
, E4 c& R4 L; W5 f& R# R
if err != nil {4 [: L; M7 H: u% B

. Y( _1 g/ u, L" ilog.Fatal(err)
- e. H1 Q; R# C2 r( z
, z. c2 t$ p" F) C( S" \return nil, m* L0 R1 e8 X$ b/ V0 i) v
6 c5 q# I0 X$ [$ k; A# T
}! f& f+ f4 A, K3 W
* _% q9 r( n* B4 c# K
user := User{}
! }) y/ F4 @1 O. t6 B! h
2 r+ k, ^& S1 U9 qstmt := db.Query("SELECT * FROM user"); f+ G- F( n$ ?8 t& v
7 |- |& @8 ], `0 q  \/ P
for rows.Next() {" f4 ?* q" D+ B

  d/ U4 Q' `' P4 c( m8 G# trows.Scan(&user.UserName)
7 h1 p1 d& `1 y# u- C3 \2 Y6 z' u- H! z0 x$ \: y* c9 ~
fmt.Println(user.UserName); Y2 B4 O; h3 D! `+ S
# g2 m* T. R9 l& Y2 p. v7 N6 B& o! }
}1 x& H# m4 f. M8 u

5 D% R$ Z+ ~: V6 Z" V/ s) [2 @2 D) vstmt.Close()
" W8 |0 `( z; Q  @
( s% C: V  E( M+ a; X6 y  R+ R}* m% _0 y# z: B* o5 r0 e4 `) u

5 G/ z2 E, a2 t7 M) S+ y. |三、总结
5 E( r7 d7 S( u! G
* t4 I0 N- f% x  p! S对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。& i8 q7 Z* w/ i1 v
1 k5 q+ Q! A8 T* v* D
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)% j# e4 ^% F6 ]9 \& E$ Q- {

: \9 Z# W- c1 [  ]0 ]/ i( H在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
" S  d- t* ^' a( ~5 B0 K0 ^8 J8 x% i0 i. \. Q6 f
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。" ~) l+ y5 I( h3 B; W5 g
————————————————0 ~' Q6 v+ H4 ^# _9 v, x
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 I3 V9 o- Z. z. y' r: a原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339613 U5 V3 E( q+ [, m  H  N7 K4 U
" P/ u2 T3 e4 \+ Y' ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:47 , Processed in 0.140663 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!