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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。6 N! W  K* D2 m
1 G$ j, n+ L  j, b& z8 T4 H
一、数据插入 - INSERT
3 V- |% q* Z' N- B* Y2 v
: `8 Z  ?& c7 r3 F1.1 : DLang 插入数据
- T4 u1 p  Z. l6 h# J
4 c# G$ f+ i/ N/ R8 dimport std.stdio;( n  U6 B4 |% [& H8 s+ S" P* g  r

  L1 M2 G4 u# `& ~! G% Cimport hunt.database;9 F# S9 h6 D( U! X6 w

! x3 D8 S4 O& u5 T1 R5 @8 cvoid main()
9 e; b, c, C! y6 C' S3 f. Y. i
& l5 z8 g( d8 f3 |: K, D{
- q0 q2 }) o( }" u0 \% |- y- l" f4 h, b2 Q  w7 k
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
% P7 O3 a, M" A7 q7 a7 E
) f% O/ }3 s" o. r7 {int result = db.execute(`INSERT INTO user(username) VALUES("test")`);: f: h  m5 e4 r5 \: [/ I
2 c7 S7 l' v# f2 ^$ f- I) k3 [9 O
// 打印插入数量* W# X0 w+ B0 P" ]! K7 |

/ U5 I( Z0 g) h# Lwriteln(result);, z/ U' L4 W5 E( K

+ k/ t) _( z% L* o. l- odb.close();3 m5 u0 z" o( D  l* k, z4 a
7 v+ T' w0 G4 s9 \" T
}% J6 {8 O8 C2 p! A" v3 O& {3 W4 S  V

$ g+ j& J( G4 p$ `+ F1.2 : Rust 插入数据5 g, @$ N5 y) @% R( _/ b
1 i6 R" W9 t1 C! J
extern crate postgres;
; M# v! S, [4 h
4 w8 `( s3 N1 u. I# [; cuse postgres::{Connection, SslMode};7 u2 A+ ~5 y- d% _# g/ b

3 i' V+ Z6 |. e( Tfn main() {
% o3 `2 F1 D( m* V5 |! o1 `+ x2 ^% n3 M7 z7 a$ J  W9 O
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();( S% i3 }* J# s( ?2 S

; q& c( A0 z5 x: O; t; Yconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();4 X$ B, r( q/ a8 b& O$ B+ u" V1 ^3 V* I$ _
7 v9 X' v/ |; e' q4 J! P6 T0 S
}
7 x7 A, p, Y/ l0 B5 G8 |. ]5 o& ~4 x* I
1.3 : Golang 插入数据/ W0 W7 f4 ]! C0 \$ O4 J  Y: {

" N- N$ W% ^: Uimport (
  A/ W( C6 w  f, U! C) ]
8 q) c$ R2 r/ F$ v& E' ^"database/sql"5 t1 q/ G9 q# @0 I6 Z
! x. h7 s+ z0 Y) Y. W! U3 @
"fmt"& ^4 s5 ~- I+ h
0 Y. O  Z. `  Z& d( K' r# Z, ]; O
_ "github.com/lib/pq"
2 I  s! T2 n0 Q+ a; @, m, r) ^2 L/ s6 v! s
"time"
5 s$ ?, O1 O4 f' Z! F2 G: Z! w# D6 p* L' P' x
"log"6 Q  t. N' [0 k$ L$ }" z" [7 W

5 i# C5 Z# [. N  ?7 Y) u( l)
7 K0 K5 \2 g) m+ Y( V
5 N: Y/ r" T6 k- h6 d4 K# N, {* ffunc main() {
+ ?% @( W6 z9 m4 |& r+ R* V9 f8 Y
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 y; u! s1 a! Z' |* G% J2 N$ U, }7 o# j' ^% N% T
if err != nil {3 A, o% `5 i! f! I- ?8 l

9 q; i( i# L+ ilog.Fatal(err)
# W8 b# j8 Z/ V) f0 k5 W
+ F( ]$ K) S9 y/ Areturn nil: X# L9 x2 p) |% M$ G
2 p/ K0 B5 j! j0 x1 n
}+ K4 P6 r% P/ O1 S8 b

: a, `' w) u4 A" pstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")" A% |% @# F) J  O7 c! V( K) _7 ^) T! W. Z

1 [! o& N6 s. `stmt.Exec()
( f( B8 p2 v1 D9 a2 Z0 N/ Q3 M6 @2 \. p) p5 R' Z& f1 o4 {; k
stmt.Close()
' u& k5 W2 I- I& K6 l6 ?. l0 v
% v3 u: A. l- I8 y}
8 Y6 }, K# f( C; ^! f9 G5 J% g( k) J
: O6 g8 w# v* ?3 `: |二、数据查询 - SELECT
( z, r  j9 t& D) }6 s4 ~$ [& e" P
2.1 : DLang 查询数据
5 ~3 \$ \6 ~6 c7 R( J0 h! i2 v, i
import std.stdio;
; p- v( Y; W) W2 z. |! t0 u' C% ?3 ~/ X  L: M
import hunt.database;, q# |) A/ t* o; P6 Z

( e" `8 k9 V* E8 Q' P# j; X5 Nvoid main()+ f; b8 p6 S2 M, _: @/ Q7 p) R" X) M

# @2 V2 B& G$ Q' _4 w  z3 d' o{
* p) s, m% D/ G2 k7 k
6 U/ K4 T; u% `4 v2 s, L' M2 Hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 x! x; V3 t/ v

' i; f% ?- z( ~3 ]foreach(row; db.query("SELECT * FROM user LIMIT 10"))1 J$ Y+ D% Q" y4 Y

* L1 v$ [* g2 l0 @{
) F6 k% j8 J8 [) j; k9 y+ ~
3 h0 m) A3 H/ K7 M6 Q& Lwriteln(row["username"]);1 a+ t. V/ P1 Y5 Z3 Z9 X
; `. a7 X  L) O
}2 O8 z% t1 a' A* l' b# M6 \2 v- U

. y4 F+ N7 e/ x% Y/ `' E9 S6 Fdb.close();0 ]5 S5 h4 Z8 ]/ Q! w7 c

1 H4 f8 z) g' _9 }4 J}
; N9 k; ~3 p0 d! a
5 {+ P* C7 j2 p) Z! i* ~2.2 : Rust 查询数据
( V8 ?! h# }1 C" H
7 `" u+ o7 k, J9 N* textern crate postgres;! A4 N* k9 u2 J
, k7 A" z. v2 K7 {1 c( {
use postgres::{Connection, SslMode};& l  W; M. q$ z& o( a4 ~

) k$ b& x/ F7 N1 ]' z) C' Bfn main() {6 w( H' Y/ m6 d" j' h: {- u
, r# u8 ]' D7 [/ I4 z" }
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();( m# L! K0 Z& C% a; H( X
) k7 W. A; F/ W0 x% {+ p  t! ?
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
7 [: l; l4 W& ~6 T, t. W8 V5 r0 h- o
9 g" p+ o  P5 r, o& f: A  ~println!("Found person {}", row.get(0));  W9 `5 N" }/ l& A. N
' u! y- b. O; X+ B% G9 j* [: [/ G; V
}
+ f: X' F+ T4 }5 _/ C9 C
) B6 `+ M( b, z7 t) R: q7 B}+ h' p0 M- x6 p- d( g. F  G
9 w6 p. W3 C& F) G
2.3 : Golang 查询数据1 R( n' r$ b1 w; Y

( A. X  l1 D% Z: @+ b# Nimport (
$ E2 _  ~# F. `" `& i5 z( p
: H( L3 T- x4 |& Z: I"database/sql"7 I0 S. m9 c& ^" ?$ q6 g* @
9 Y- y- N0 E. J* j
"fmt"" _# m" a) S9 z* n/ D
% h4 m, W. Y# b% i' l
_ "github.com/lib/pq"
6 v1 G  q  _! c' C, h
. v( c6 l3 s. c' G"time"; [% A4 D# L3 o. h& Y: n7 J& m- P

1 `% O" W+ J& Y+ M4 @"log"
! y4 {( P+ U. I# D" d+ M4 `; P
3 ^/ {. l7 \/ T4 ?5 R)
7 l) d, Y8 x, l! Z. e4 B  `0 |7 H" F9 w% ]& w) ^; w# X
type User struct {5 m2 J8 P0 R$ I$ R. V8 M2 d

, v) I" H9 r* T/ b5 UUserName string' ]% V$ U/ ^+ e3 ?' W8 ?/ @
" `0 C" G6 i* k' \7 A% R
}5 C" o) V0 F6 Y. s% }% F
" p: Z5 {5 @8 U
func main() {. j0 g5 h' l6 D9 v

% K* [5 K8 n" Fdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 \( Z/ T. m0 h- Z; I, W; M' H; b
- h1 a! r" m! P9 k( k+ kif err != nil {; L9 m+ \/ `% b& [/ g
0 N. a0 }1 x7 i( }2 R* U
log.Fatal(err)) C/ Z) U7 F' G% E

! s: D- `# F4 t5 ]9 _; q3 jreturn nil
) ]( e) h$ e4 Z  v, Q% x1 d* [0 B, b: c* A, g! ~7 J$ l
}0 k0 _5 d, R6 L& w" }) ~- S

/ d/ k. z9 O, I% [% auser := User{}
7 f- V- }9 ^2 I) k$ z0 c
" D) q: m+ v) c9 @% @stmt := db.Query("SELECT * FROM user")) h8 `" o) {" t* w0 ]0 e

. m" p+ |& O/ n4 w2 tfor rows.Next() {
* a: t1 M* v& _2 k( }: p- r# K$ ^" F1 {$ j: E2 L. z$ w
rows.Scan(&user.UserName)
6 v( M  w  p3 S5 F7 K( s% _. ^' o! Y; l, k6 t- e& u2 f1 e, O: c
fmt.Println(user.UserName)( a. Y6 `, G- B& @/ m9 I

  T% f' r. v, y$ z/ Z}/ S0 s: ~1 t+ Q* r
$ d0 Y8 N2 O, f' d1 d9 w
stmt.Close()* Z# d6 C8 T3 ]+ G" l" d
9 S/ H/ `# ?: ]
}8 F: |, l. ]7 E- [4 e+ m5 F
/ H) a2 r9 O& ]- ?8 E! Z4 _/ ~
三、总结
" z7 H( ]5 F( \6 u
6 b% g% }5 Q" f. e对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
+ Z7 [& v) ~4 c
! G+ H8 K  |6 V. D7 \这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* a% N* J9 M: o# M. s3 A' \' Q, {
$ v) ]  `' G' ]1 D4 X在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。7 o1 o1 D" z$ S' s# g/ y
" Q& F! V3 Y: c1 d( \4 `
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
+ `' e  Q' R- T6 h) t( _————————————————
, L7 v7 Q& @* a3 u& J3 k版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 e2 E7 q4 a( \' H  E6 H# i1 B原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
$ R" ~3 k8 Z" C4 |5 L" l) @
, P: Y5 j" w% M+ ~8 @9 O4 s; x7 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 17:26 , Processed in 0.113386 second(s), 19 queries .

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