MogDB企業(yè)應(yīng)用 之 Rust驅(qū)動(dòng)
引子
Rust是一門(mén)系統(tǒng)編程語(yǔ)言,專(zhuān)注于安全,尤其是并發(fā)安全,支持函數(shù)式和命令式以及泛型等編程范式的多范式語(yǔ)言。Rust在語(yǔ)法上和類(lèi)似C++,但是設(shè)計(jì)者想要在保證性能的同時(shí)提供更好的內(nèi)存安全。
Rust已經(jīng)逐步開(kāi)始進(jìn)入企業(yè)應(yīng)用和操作系統(tǒng)的內(nèi)核開(kāi)發(fā),之前聽(tīng)過(guò)幾次openEuler SIG組的雙周會(huì),一些內(nèi)核模塊已經(jīng)或即將使用Rust進(jìn)行開(kāi)發(fā),雖然一些現(xiàn)代的開(kāi)發(fā)語(yǔ)言現(xiàn)在還很難撼動(dòng)傳統(tǒng)的C/C++ 地位。但是像go和Rust已經(jīng)開(kāi)始在一些領(lǐng)域里面嶄露頭角。go的目標(biāo)是取代C,而Rust則號(hào)稱(chēng)是C++ 的最佳接班人。
一些大企業(yè)已經(jīng)開(kāi)始使用Rust進(jìn)行核心業(yè)務(wù)的替代,同時(shí)也開(kāi)始替代一些底層的基礎(chǔ)庫(kù)。在數(shù)據(jù)庫(kù)領(lǐng)域Rust也逐步開(kāi)始完善其功能。Rust提供了PostgreSQL的客戶端驅(qū)動(dòng)的同時(shí)還提供了插件擴(kuò)展(PGX)和過(guò)程語(yǔ)言(plrust)。經(jīng)過(guò)嘗試因?yàn)楹髢烧哂捎谏婕癆BI不兼容的問(wèn)題(C和C++ 導(dǎo)出符號(hào)的問(wèn)題,即openGauss/MogDB使用C++ 開(kāi)發(fā),PostgreSQL使用C開(kāi)發(fā),編譯動(dòng)態(tài)庫(kù)ABI不兼容),所以暫時(shí)不能在MogDB上應(yīng)用,但PostgreSQL的Rust驅(qū)動(dòng)(rust-postgres)則可以在MogDB上正常使用,本文將演示rust-postgres在MogDB上的使用范例。
實(shí)驗(yàn)環(huán)境
- 使用win11自帶的WSL,集成Docker Desktop,安裝MogDB3.0.0鏡像。
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
- 獲取鏡像
docker pull swr.cn-north-4.myhuaweicloud.com/mogdb/mogdb:3.0.0

- 啟動(dòng)容器
docker run --name mogdb --privileged=true -d -e GS_PASSWORD=Enmo@123 -v C:\mogdb:/var/lib/mogdb -p 15432:5432 swr.cn-north-4.myhuaweicloud.com/mogdb/mogdb:3.0.0


- 進(jìn)入容器
docker exec -it mogdb bash

可參考廣泛文檔中的“容器化安裝”.
應(yīng)用開(kāi)發(fā)
- 新建工程
rust-pg
$ cargo new rust-pg
- 目錄結(jié)構(gòu)
frank@LAPTOP-4OF1323N:~/project/rust/test$ cd rust-pg/
frank@LAPTOP-4OF1323N:~/project/rust/test/rust-pg$ tree
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
- 修改
Cargo.toml文件,增加依賴(lài)postgres = "0.19.3"。

- src/main.rs代碼
use postgres::{Client, NoTls};
fn main(){
let mut client = Client::connect("postgresql://frank:frank~123@localhost:15432/postgres", NoTls).unwrap();
// let mut client = Client::connect("postgresql://frank@localhost/postgres", NoTls).unwrap();
client.batch_execute("
CREATE TABLE IF NOT EXISTS person (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
data BYTEA
)
").unwrap();
let name = "Ferris";
let data = None::<&[u8]>;
client.execute(
"INSERT INTO person (name, data) VALUES ($1, $2)",
&[&name, &data],
).unwrap();
for row in client.query("SELECT id, name, data FROM person", &[]).unwrap() {
let id: i32 = row.get(0);
let name: &str = row.get(1);
let data: Option<&[u8]> = row.get(2);
println!("found person: {} {} {:?}", id, name, data);
}
}
- 編譯crate,使用國(guó)內(nèi)源,列出所有依賴(lài)。
frank@LAPTOP-4OF1323N:~/project/rust/test/rust-pg$ cargo build
Updating `tuna` index
Downloaded postgres-types v0.2.4 (registry `tuna`)
Downloaded 1 crate (28.1 KB) in 2.14s
Compiling libc v0.2.132
Compiling cfg-if v1.0.0
Compiling autocfg v1.1.0
Compiling typenum v1.15.0
Compiling version_check v0.9.4
Compiling proc-macro2 v1.0.43
Compiling memchr v2.5.0
Compiling quote v1.0.21
Compiling unicode-ident v1.0.3
Compiling futures-core v0.3.23
Compiling syn v1.0.99
Compiling subtle v2.4.1
Compiling pin-project-lite v0.2.9
Compiling futures-channel v0.3.23
Compiling tinyvec_macros v0.1.0
Compiling futures-sink v0.3.23
Compiling futures-task v0.3.23
Compiling log v0.4.17
Compiling futures-util v0.3.23
Compiling bytes v1.2.1
Compiling ppv-lite86 v0.2.16
Compiling once_cell v1.13.1
Compiling cpufeatures v0.2.3
Compiling parking_lot_core v0.9.3
Compiling unicode-bidi v0.3.8
Compiling pin-utils v0.1.0
Compiling futures-io v0.3.23
Compiling smallvec v1.9.0
Compiling siphasher v0.3.10
Compiling byteorder v1.4.3
Compiling fallible-iterator v0.2.0
Compiling scopeguard v1.1.0
Compiling base64 v0.13.0
Compiling async-trait v0.1.57
Compiling percent-encoding v2.1.0
Compiling generic-array v0.14.6
Compiling slab v0.4.7
Compiling tokio v1.20.1
Compiling lock_api v0.4.7
Compiling tinyvec v1.6.0
Compiling tracing-core v0.1.29
Compiling phf_shared v0.10.0
Compiling phf v0.10.1
Compiling tracing v0.1.36
Compiling unicode-normalization v0.1.21
Compiling getrandom v0.2.7
Compiling mio v0.8.4
Compiling socket2 v0.4.4
Compiling rand_core v0.6.3
Compiling parking_lot v0.12.1
Compiling rand_chacha v0.3.1
Compiling stringprep v0.1.2
Compiling rand v0.8.5
Compiling crypto-common v0.1.6
Compiling block-buffer v0.10.2
Compiling digest v0.10.3
Compiling md-5 v0.10.1
Compiling sha2 v0.10.2
Compiling hmac v0.12.1
Compiling postgres-protocol v0.6.4
Compiling postgres-types v0.2.4
Compiling tokio-util v0.7.3
Compiling futures-macro v0.3.23
Compiling futures-executor v0.3.23
Compiling futures v0.3.23
Compiling tokio-postgres v0.7.6
Compiling postgres v0.19.3
Compiling rust-pg v0.1.0 (/home/frank/project/rust/test/rust-pg)
Finished dev [unoptimized + debuginfo] target(s) in 37.67s
- 運(yùn)行
cargo run

- 驗(yàn)證

- 說(shuō)明
在main.rs代碼中,第一行是鏈接MogDB的范例,第二行是鏈接PostgreSQL的范例。
let mut client = Client::connect("postgresql://frank:frank~123@localhost:15432/postgres", NoTls).unwrap();
// let mut client = Client::connect("postgresql://frank@localhost/postgres", NoTls).unwrap();
尾聲
PostgreSQL是擴(kuò)展性非常強(qiáng)的數(shù)據(jù)庫(kù),甚至可以說(shuō)沒(méi)有之一,它幾乎兼容了所有主流的開(kāi)發(fā)語(yǔ)言。并且經(jīng)過(guò)多年的沉淀使其積累了很多功能強(qiáng)大的插件。這也為目前基于PostgreSQL的國(guó)產(chǎn)數(shù)據(jù)庫(kù)提供了改造和擴(kuò)展空間。尤其是對(duì)oracle兼容方面,很大一部分是利用PostgreSQL的擴(kuò)展性(orafce)進(jìn)行兼容改造。當(dāng)然,由于openGauss/MogDB將PostgreSQL改造成C++ ,因此一些插件在遷移時(shí)需要進(jìn)行必要的改動(dòng)。這需要整個(gè)社區(qū)的共同努力。




