管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
: l5 b. }. Z" y; P) Y5 k. o8 I( X$ X$ o7 V
一、数据插入 - INSERT1 a# ]: x! Z) x/ A2 f
2 J6 F3 q2 I4 L5 H- [: i
1.1 : DLang 插入数据
N4 _4 v! H( J: X6 `) ^2 A' X5 W1 C6 I6 n0 H* \( Y, D9 C5 B
import std.stdio;
$ X# k- g6 |2 q; Y7 ^
* f& d/ u7 @) V# E, i( M' Qimport hunt.database;
3 f, H7 J8 w8 [
' M, L \3 ^2 P5 K) }# H* Kvoid main()
- c( r8 @' Z% T' A# w) B7 t) W3 e* ~# f0 ^0 B E3 z
{$ D3 ]9 s- x) }
8 H) ~3 W9 L2 U) X& F! L( q
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");& w2 a3 N) u$ `4 Y* P- @4 m
) {5 J. u4 l7 }; r5 L
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);& D! c% k8 C) F- d
; w( `" Z$ b% v# X! A& @// 打印插入数量
# t0 @0 n# X; y0 y% x9 k5 r9 c0 D: ^' V* G9 t; A
writeln(result);) }5 j3 r' V; N. C& [( y
# a6 L0 C3 t3 O* F/ @& J
db.close();
/ C: K0 F7 O0 [0 Z, O" r! M6 E; N: T- y4 f
}! ], P* }' L/ _ {
% d4 S6 V# o" k3 P2 D7 v
1.2 : Rust 插入数据
; M x# N4 J4 M, _& k3 V
: v( E, ~" n' W! k5 Sextern crate postgres; i) P2 f5 u( f. w. G6 I5 w) O; S. \
+ P) {4 ] g0 `0 |8 j( iuse postgres::{Connection, SslMode};
4 P- Y+ \% B! D8 e* Y! u8 d; f+ t% l3 U( l
fn main() {
' e+ C) s( i9 o; ]8 ~% A
7 V; w) k, P% h) u s! nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
% R. |/ w1 E, G. ?
$ z# P" ?% e) |5 \; [0 M$ Nconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
7 T9 d. a+ r& @+ C6 [4 R( f
* R' u) s) c. p% \# B$ ?}
2 ~( I5 Y& h, E3 ?* [2 N* p% N& k9 o4 h; d. ]3 W
1.3 : Golang 插入数据
: D8 ?3 q3 U/ W8 y7 w. R( _
& D, s% U+ k K7 v4 ` I$ ^1 aimport (
$ g, w3 a8 B7 t0 b7 O
2 s% G2 T$ W; s, J"database/sql"
6 w' N( o6 U5 K/ v- v6 O3 S; O7 V1 V8 M3 q: v ~6 V1 y
"fmt"
% q* |# P: N5 \. Y/ Y' E9 M. _8 b" P I
_ "github.com/lib/pq"
1 j( ], o7 @1 Q' @ \0 J& W0 R8 U" ~& Q$ a) {. C& f. v
"time"
7 b' @1 `7 |1 M) b1 W3 M
# ^1 Z0 ^2 i Z"log": `; c* p; ^% M# K! s$ H0 H
1 R% x+ D4 G' M3 ^)! i8 l, |. H% l. B$ J; F* _
7 ?- k: }) U7 w+ [ t5 e; }func main() {
0 G8 P* m9 b: ]
$ w! L& |0 p. D; C6 Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' Q/ a0 {5 | t) w+ U
& [: q0 {2 H" `# k- f
if err != nil {
, R8 ^0 o$ r$ Z7 V/ U
2 E' v' U" s' M' J4 C2 o8 {log.Fatal(err)3 n& Q$ W1 o+ w' G2 d, O2 @
2 D8 J% R) C- Z5 t! Dreturn nil+ q" N) q! w1 ~9 J) r
6 P; `5 K* l. v% S}
, z. s% L1 z( G. @
- U- o5 Z8 E# ?+ t, Q5 cstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")9 E0 g& T8 y, [' E3 `2 q
0 K3 V8 P( m: D4 Q+ t4 Ustmt.Exec()
, O# q3 {8 R/ W0 t9 x. J) a( G4 Q0 Z: K( T( Q, u
stmt.Close()& i0 Y( X8 \8 c; o
( r$ E B8 M" f; H: k8 k( v5 F
}/ t% ~4 U2 f- B2 s5 t
$ m7 v2 Y; }6 ^" j5 N- p二、数据查询 - SELECT
/ p4 M0 _. D( u3 }* Q5 V! l3 X6 u! C: |# X: G# M9 w0 |9 f* c
2.1 : DLang 查询数据
( a' E) I9 n4 E; e
- T) O p' u' ximport std.stdio;$ t U8 w4 T' J @
7 f7 c3 k9 ?: y& C- b' O( E- C+ K# m2 j; j
import hunt.database;0 X3 q- F% L7 y- R4 I) K! ~
. p/ w) i% a- {' w C/ K
void main(); T* H. p, q3 Z, e1 ?$ J
i1 W: E4 X0 o* ^{
1 o" d# t. |( [$ M2 w/ s! e3 ~* _* Z9 F. `2 J$ J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
4 k; L; h1 D; L( T/ {3 v! }4 }; k6 s# B* l
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, Y: l6 |5 A4 m" Z# ]8 q5 \; p, F! a( O( `# y/ o/ Q `
{
7 P7 v9 Q, C/ y& p
6 ]9 o% u" A, a6 ~( E" W& H/ z* wwriteln(row["username"]);6 W* P! j/ V# O! L3 E$ `" _* h
7 [5 p1 |5 F" ]9 O: z
}
; K2 x4 T3 a. N3 @
1 G3 v# A' \4 X9 O; J mdb.close();
5 k7 ~6 e5 h7 E+ c2 }
, H' Q* [5 F/ @' \( `}2 M; @' s1 j* X8 I1 S: W
2 F* I$ U; m) a2.2 : Rust 查询数据( L4 G1 a' ~5 |( _
: R& e. y" ^* O4 j( Q. T
extern crate postgres;+ H3 f* o$ X- L- `. {0 I
$ l G+ H& c7 v' A0 y7 T
use postgres::{Connection, SslMode};6 T: G/ a- t" s5 R: z& |1 T& T
" s3 Y, c& T- F0 ]
fn main() {: t$ \2 P* Q8 J# w: Y( z
, r6 l8 j' E% [2 n& R
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 _9 Y. w$ {' A0 j3 Y% U3 ^" X; `- X2 K1 X
for row in &conn.query("SELECT * FROM user", &[]).unwrap();; g+ Z! p' ~2 ?& E6 V
9 e+ W5 M I7 l1 ^3 M6 qprintln!("Found person {}", row.get(0));2 [: b# ?) p4 \
$ R/ T6 z" g' T: z6 G# W}5 _! |" ^" \. }8 k+ J
- i; \7 f* m7 k, R. i}; k7 Q) G C- _/ K2 K, K& L
" U4 i6 b3 b! _4 x" l Z- Q
2.3 : Golang 查询数据
6 W" {; a: z; F6 e8 E- w
6 y; T3 b5 Q! @1 limport (
3 Q/ ]1 S7 ]/ D. i0 E% I, T6 b3 } I# G |% W' E- o/ N- o G
"database/sql"' q% R0 b. |2 D9 l
, C6 E& x8 n9 X- U& \
"fmt"& e1 f! U. U8 Z! H: p) K# R- f& O0 r
1 x4 m9 C0 [8 q5 G6 ^* B_ "github.com/lib/pq"# ]1 `$ b' w" t, P S
( T: V y/ D/ u- m" h"time", Z$ i' W1 |1 X* k: o: w! s! g
2 o' S2 O5 S% m' m"log"5 P2 | I$ _% s$ X$ T4 ~+ ~
2 r6 s) {8 j: m' X5 h% i% ^" W
)3 M+ ^% H9 y& o
8 p# T: r+ N5 P0 n6 E1 C5 F
type User struct {
4 N4 Q) T- ^8 N$ T7 I0 z1 I9 v7 s [8 n
UserName string
* G: F! {' F i, G1 _6 m: `4 _4 w4 |! r' R2 `8 y2 B; `
}
! X* R# Z( V' R5 i$ u1 `
- e. [7 }% s! w+ @! D* _' A+ d+ xfunc main() {! I' Y. m5 h& Q' j4 u# c
0 p: ^! m1 g' r" v* Z2 v' ? R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")% \. M2 K" a `
" x& N# o0 w9 |0 i1 E; r
if err != nil {
$ p( W7 i) R: Q; ]
# E8 R! {3 J$ s! |log.Fatal(err)
0 D( ~: M& a/ B5 C0 {# R2 H* [
& H. P* W( T8 D1 Z7 V0 Kreturn nil
$ W! e" S+ A' q. T9 a4 g' b2 @8 h1 m. B8 ^0 M* v8 X0 n
}
' }4 o& e5 ~* I" v' {- k8 C) e/ b
user := User{}6 B( O2 B9 ?" s
" u# o7 { J0 J: p1 I$ Xstmt := db.Query("SELECT * FROM user")" ? b. \* [1 L! r. C+ y( {2 Z" g
) { F4 U$ K6 H2 C* M0 e. pfor rows.Next() {
( a& t* D) B. F8 Y' i; ~" |6 m7 D A S
rows.Scan(&user.UserName)0 T# l6 d7 N' r; ]5 |/ e/ @ J
( z$ I/ P' r S" l p1 b6 Z" ^
fmt.Println(user.UserName)
: s) j1 p1 y7 J. b
: L/ q2 \9 B8 t# [7 w" {) i}/ J7 A) R) o; @; M5 ?: F6 l
- R, b0 Q0 `: v G
stmt.Close()
( d# s( C$ i# n ^+ O+ H2 \/ l/ O/ p) o% G
}, p6 f4 _8 Y( Q' D8 r
' r! {" d/ e( x, H$ C* s1 k8 Z
三、总结
4 m& n A. z" T, ?( N
& Y/ o1 _" x7 w" _& f h对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
5 ~& e! V1 T, ?, w
+ e# S# K! H+ {1 T4 \. d这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
3 J' p. e# C, u& T: N5 H0 P: K) V) j0 o& m- n4 A
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。. s/ y7 `) O/ z1 |. }
* E# _! Q8 y) k) j' V0 l总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。: [: l1 S2 i' w0 r! L: e
————————————————! {& \' [: v/ v
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( n& g& T# m% _; W; _# M
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961* _) |2 Q( B0 G& D" Q
; `7 J8 E* q2 V. T' ~. ~ |
|