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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
- _' Q: c0 @9 r8 k0 q; r7 K" y" I$ O" _6 D- x
一、数据插入 - INSERT) m# P/ g. X5 ], H$ Y

3 ~  l* x7 B& o8 X1.1 : DLang 插入数据
! y7 ?+ h+ H( S! Q( a; V6 [
& q8 x3 y$ P3 _6 a  T7 T/ S4 |import std.stdio;
7 v2 L+ {2 W  f* \( v& b7 `2 a/ n% i* O4 N2 h2 M. Y
import hunt.database;
  a; x8 c& u% G2 u2 Q/ v" e
' A2 `& Y! `) o# J% v% G3 uvoid main()( F8 K3 h3 ?" e% }3 i$ a. ~1 P
" l1 s6 \6 E, |* {3 \$ {
{  Y5 e/ k9 Z" U- Y( B- T& i

. ~" D& O1 k% |2 J! Lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");' e0 a( n$ q( I
: t. H# D, [$ K1 k
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);' I$ d% P. z/ \9 \: u2 D
) b+ k" d0 ~2 X4 q
// 打印插入数量
0 l* Z' s8 k* m: H  z' ]7 C: D7 H% p
' Q1 _& y4 S4 N# D* R! kwriteln(result);1 R5 i4 f" s8 _% _9 r

) i& c2 ~6 n" U% Zdb.close();
2 @0 e& N* b3 u+ G% e( R. \- \, F% [& b2 C% @1 C, K
}
$ i8 T! M* O( t" V
& a; b/ h9 L! C2 D1.2 : Rust 插入数据
) ~- @9 D" E, t+ Q
: ]$ i: z7 V/ e. v5 uextern crate postgres;- |  T+ M: |' \; `& d) j  B# f: E
- k. B, ~; s$ F9 x2 ]6 o
use postgres::{Connection, SslMode};# V4 W' d( `! ?

( [" }9 r$ |1 E$ y) p/ I  tfn main() {
: l0 s  f) @) `* O- |# h
5 N5 v$ `2 n5 P  m0 s: j) clet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();: T4 ]0 ?2 h1 H- h9 |7 s  K

: u7 }: \6 j4 X5 {; R( dconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
/ D# {# O, ~0 T2 E9 P5 u0 \2 S1 W5 J' b6 S
}' r& S7 X: @4 u& M/ z, d5 x) [4 k1 m
0 A& _7 r: s9 {5 p8 Q' K* z0 ~, C
1.3 : Golang 插入数据! w1 d, C. O; T/ A+ f2 v

3 K7 A2 y  D( M( Q5 R8 L4 Oimport (
$ e; H5 E. S8 [/ t1 b; L$ s8 y! b+ G) m# g" A  N  ~! T# F: w/ t
"database/sql"1 O" g: V$ u9 t8 S, Q$ Z# Y

% `% f; Y7 U8 D5 @( x+ J0 C8 H"fmt"
$ p9 v% Z7 S3 l  g& O& i
3 D7 s3 D* m  J" R" O9 w_ "github.com/lib/pq"3 N, }+ V8 ?* R+ H0 v

( y% H5 }, r$ p2 c# A3 }"time"
5 p, _6 P1 ~0 y2 C% T% T! N9 _
4 _! n9 k; d, J, ?! F0 F0 ["log"1 g& g. W6 T$ @5 W! ?2 `* {. K3 h
4 V1 Y5 y: E% Z$ B* b
)
. q& s5 S/ O& u$ D6 p4 C& ~
5 f1 A, G3 y+ h! p/ T" ufunc main() {7 _* S% ]+ v/ w8 ]. I

, F. y$ v6 k" m+ w8 Udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 X! s8 m% ?  Q& [/ l. `+ ^0 z3 Q3 X- ?
if err != nil {1 ]# |6 X0 U* a% C" |) o0 _0 ?

* G. B4 ?+ s2 h- q9 C4 ~# zlog.Fatal(err)
2 W" }7 q/ ~. @+ P! Q
8 n( P) f& C6 P( z% h. breturn nil
+ c$ r$ a8 o. b. Z4 N
; B; T+ E. b9 T1 \% o+ i: N}6 r* m# {5 P5 P4 f- c5 A* Z
+ N9 A+ k) i3 A+ g9 w
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")5 F. W! k7 P0 U/ y* Z$ I

. N; z# u& [; Y; I( vstmt.Exec()
( Q% k" k3 R- O
) l. H4 @8 a1 v" m5 g& pstmt.Close()5 @& x# [* L+ u# ~" [  z* O9 f

  O7 y# r$ T& a}
5 _( X. h& N$ E! p
5 J: r* g! Z, u9 l7 J5 T二、数据查询 - SELECT
1 T; @4 H4 f7 @* K$ j1 \* u
4 @( }4 C& A# Z0 f/ u4 M# [2.1 : DLang 查询数据
- Y+ Q$ j5 K* J2 W2 Q& Y" j9 ~
import std.stdio;% Q7 v6 _5 M0 U( Y/ t

, O% M& a9 K! ~3 Himport hunt.database;
" `* i( Y7 m2 e* v% i
) Y$ c1 T8 z1 Z  Q: Cvoid main()1 P! ?4 ?8 s5 Z- a  Y7 {5 C
+ G' L* _/ W- i/ B
{" J2 B( }" q6 B7 u6 W% ]
7 ?+ S: x* C1 ~( B. I5 B3 E# Q
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; ?$ F5 [/ ^6 O. m* c, j7 T/ B- K2 W. U" Y$ e
foreach(row; db.query("SELECT * FROM user LIMIT 10")). M3 q4 o3 m/ U9 q
: B/ {" |8 R% _8 e2 I
{
+ t! {, z; c9 n7 T$ E8 b8 H: _. H+ ^3 ]" X+ E- Q" ]* @
writeln(row["username"]);7 W' I6 z/ C% B7 J3 t" ~- {

2 A. ~% P; d: y& r, y. P1 f}, X+ ~1 |; G$ {6 K( k4 v6 k
) O% O0 M! C' \5 a, k
db.close();4 z( K* ?: W) J5 f

0 S9 L8 d+ g; J7 h}6 ~$ B; S; V! J9 S5 j" h, W& r
& N: y3 K3 f5 K  W/ x4 b
2.2 : Rust 查询数据$ o' o, b5 y) ~/ F' Y
  K" W+ }+ ], |, E4 _5 U' ^" w
extern crate postgres;5 n7 ?1 N4 D+ t
+ g% o  h* ~, F+ ~4 ^$ m9 U
use postgres::{Connection, SslMode};
; o& {( t" z4 R* {4 p3 `* l+ U0 e+ O% R# p/ p; T* \2 s3 P$ P- a& I
fn main() {
9 d, q, T. A. u! }3 u1 N, X' A! j& F" L! I
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 D2 s* y2 N' Z; j& B* ~, \1 X5 L7 |( F7 s/ D9 }& r4 m
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( c9 b4 \3 v# ~
7 y3 C/ P" o5 Cprintln!("Found person {}", row.get(0));
: b$ _; V1 C7 R1 C. @2 D4 P* {+ e
. P% X1 |/ h7 m: p5 j) t; V/ M2 f}
* m$ k# k( w0 G$ q9 b; B9 l' ?) ^* ?; @- ^6 o
}
  S( `8 ~) Z; \2 S9 I) o9 p  n! n5 N/ D, T
2.3 : Golang 查询数据/ K* C% v- Q. L6 E) \2 I5 z

% V1 E9 A3 X) O3 Nimport (
+ Z$ H3 G' A, p. S% L9 {, {" @
7 {# @! S& P, o9 W4 |"database/sql"
( S# w5 T, f/ l! p. p& h- c3 L
  @9 U. {. m2 b9 o0 ]"fmt"- ~8 \4 _/ |5 e1 e

: c, M5 h( N7 \! D. x) m& W_ "github.com/lib/pq"
3 z% l' p3 }6 R* D0 g! n
) Q7 x1 d% V: m2 `7 ~3 z/ C3 S"time"
: N& T1 E; Y  g9 s& R& C, Z/ K" Q* g3 \* M& u' q+ C
"log"* D, m" m/ I( l+ x. z* O" T
6 N9 d2 f) n5 p! Y$ P  A% m
)
8 a. G; t# i7 E2 q- q; R# d7 z9 e5 s1 E/ g. F- h8 N1 R
type User struct {
0 i* e* Y3 n& n- [2 R( s* o3 R# |. z
3 o& N* ]' u; Z. I& U( X& ]UserName string9 K' f+ i2 w* N9 `
( _  }* m) R. e; d5 s
}
5 l* f! R  e, |$ z% a3 S. o% d9 [5 m* b
func main() {
6 W' }& f0 q: q1 d& e7 o4 |
+ A4 {, @' E! C9 X4 Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")5 N/ O2 \8 K) o
! f0 N3 G. J) z: }
if err != nil {
' v: d4 Z4 ~4 {# x8 [* R6 b# h9 q& Y, M2 X% C
log.Fatal(err)
) B5 |+ x9 s7 Z# J7 [
# F4 v+ C# M- A: q: Kreturn nil
- ?  j& ^! p6 @: i
1 p0 c. p- s, L* O; S9 B+ ~}
2 F; M. |2 ^0 [/ ~  K6 M* C% N0 b8 w; [( ]# _; m
user := User{}
% b) d  {% ^( f* b2 E0 U1 f0 X7 b3 u5 D% |
stmt := db.Query("SELECT * FROM user")
/ P1 Z; R# W7 A# C& N& f
% A7 ?$ S/ S8 c; d" K0 ~- [for rows.Next() {
* C( }' w6 g# _$ Y) N' {$ e- D! _/ r$ J' O
rows.Scan(&user.UserName)
$ `/ H3 O. |1 D4 z& w6 S& `/ }) }0 h0 j7 y6 ^
fmt.Println(user.UserName)' ?# L# |% n4 U7 w* j

% x3 y' r1 N# f! q8 _}
- F$ p1 j6 y+ ~+ a& ~
2 p/ n2 C4 s$ h+ G/ u3 k# jstmt.Close()
/ X' \* v+ ^8 g1 I- ~) v3 c2 x  z' d! O! s7 d0 G
}
; _8 c' N3 j# Q+ T/ _7 G) e, x. Y4 Q( J/ _" u
三、总结
. f2 r* o0 a2 w8 v/ k* z; E
1 M/ j7 E8 c9 ^' k7 i) o7 ^对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
& O* Q9 [7 d# q9 N- F- F" K, j" C5 @+ U5 E$ b
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 N( X0 u; V+ O: |4 r, e0 m9 a; {. J, N
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
9 D% ]% F; z$ Y& C1 Y: W- n& L, V2 \+ d! d) X% s' r; i1 {! @
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。2 S0 W' _2 [: v
————————————————+ s$ D. [. N, o- ^7 c
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! W9 Q( ~6 r3 J原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961! ]5 g4 `; f  J$ A6 C

8 E" E) [% q; J) t; }( b% ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:15 , Processed in 0.128066 second(s), 20 queries .

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