引子

Rust 是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust 在语法上和类似 C++,但是设计者想要在保证性能的同时提供更好的内存安全。

Rust 已经逐步开始进入企业应用和操作系统的内核开发,之前听过几次 openEuler SIG 组的双周会,一些内核模块已经或即将使用 Rust 进行开发,虽然一些现代的开发语言现在还很难撼动传统的 C/C++ 地位。但是像 go 和 Rust 已经开始在一些领域里面崭露头角。go 的目标是取代 C,而 Rust 则号称是 C++ 的最佳接班人。

一些大企业已经开始使用 Rust 进行核心业务的替代,同时也开始替代一些底层的基础库。在数据库领域 Rust 也逐步开始完善其功能。Rust 提供了 PostgreSQL 的客户端驱动的同时还提供了插件扩展(PGX)和过程语言(plrust)。经过尝试因为后两者由于涉及 ABI 不兼容的问题(C 和 C++ 导出符号的问题,即 openGauss/MogDB 使用 C++ 开发,PostgreSQL 使用 C 开发,编译动态库 ABI 不兼容),所以暂时不能在 MogDB 上应用,但 PostgreSQL 的 Rust 驱动(rust-postgres)则可以在 MogDB 上正常使用,本文将演示 rust-postgres 在 MogDB 上的使用范例。

实验环境

使用 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

启动容器

docker run --name mogdb --privileged=true -d -e GS_PASSWORD=*@ -v C:\mogdb:/var/lib/mogdb -p 15432:5432 swr.cn-north-4.myhuaweicloud.com/mogdb/mogdb:3.0.0

进入容器

docker exec -it mogdb bash

可参考广泛文档中的“容器化安装”.

应用开发

新建工程rust-pg

$ cargo new rust-pg

目录结构

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 文件,增加依赖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,使用国内源,列出所有依赖。

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

运行

cargo run

验证

说明

在 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 是扩展性非常强的数据库,甚至可以说没有之一,它几乎兼容了所有主流的开发语言。并且经过多年的沉淀使其积累了很多功能强大的插件。这也为目前基于 PostgreSQL 的国产数据库提供了改造和扩展空间。尤其是对 oracle 兼容方面,很大一部分是利用 PostgreSQL 的扩展性(orafce)进行兼容改造。当然,由于 openGauss/MogDB 将 PostgreSQL 改造成 C++ ,因此一些插件在迁移时需要进行必要的改动。这需要整个社区的共同努力。

MogDB企业应用 之 Rust驱动的更多相关文章

  1. 《Android深度探索》(卷1)HAL与驱动开发读后感

    第1章:安卓系统移植与驱动开发概述 这一章主要概括的介绍了安卓驱动开发和系统移植的主要内容,对安卓与Linux驱动做了一个总体的介绍.通过对第一章的学习,使我对Linux驱动开发有了一个感性的认识.在 ...

  2. RPA与AI_新技术能给企业业务流程带来怎样的价值?

    RPA助力于流程自动化蜕变 RPA是Robotic Process Automation的缩写,意为: 将机器人作为虚拟劳动力,依照预先设定的程序与现有用户系统进行交互并完成设定好的任务流程.RPA可 ...

  3. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  4. Vue.js 2.0 和 React、Augular

    Vue.js 2.0 和 React.Augular 引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那 ...

  5. vue对比其他框架

    对比其他框架 React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供了响应式(Reactive)和组件化(Composable)的视图组件. 将注意力集中保 ...

  6. VUE 与其他常见前端框架对比

    对比其他框架(转官方文档) 这个页面无疑是最难编写的,但我们认为它也是非常重要的.或许你曾遇到了一些问题并且已经用其他的框架解决了.你来这里的目的是看看 Vue 是否有更好的解决方案.这也是我们在此想 ...

  7. 基于VUE框架 与 其他框架间的基本对比

    基于VUE框架的基本描述 与 其他框架间的基本对比 2018-11-03  11:01:14 A B React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供 ...

  8. 解读《德勤2017年全球CIO报告》:顶级CIO的炼成之道

    文|水手 日前,德勤发布了<2016-2017年全球CIO调查报告>.在这份报告中,德勤从影响CIO为企业创造价值的能力的决定因素出发,探索了CIO为企业进行价值创造的方式,同时以CIO的 ...

  9. vue对比其他框架详细介绍

    vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...

  10. Vue.js vs React vs Angular 深度对比[转]

    这个页面无疑是最难编写的,但我们认为它也是非常重要的.或许你曾遇到了一些问题并且已经用其他的框架解决了.你来这里的目的是看看 Vue 是否有更好的解决方案.这也是我们在此想要回答的. 客观来说,作为核 ...

随机推荐

  1. Calculate Similarity调研

    Calculate Similarity - the most relevant Metrics in a Nutshell --调研学习相似度定义与计算 Zhang Zhibin 张芷彬 Many ...

  2. CSP 2023 My Codes

    T1 小苹果 题目描述 小 Y 的桌子上放着 \(n\) 个苹果从左到右排成一列,编号为从 \(1\) 到 \(n\). 小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果. 每天在拿的时候,小苞都是 ...

  3. Java 常用类 String的常用方法(2)

    1 /** 2 * String 常用方法(2) 3 * boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 4 * boolean startsWith ...

  4. MySQL汇总数和分组数据

    1.使用SQL语句对数据库表中的数据进行简单的汇总和分组,这里要注意 count(*) 是对表中的所有数据目进行计数,不管表列中包含的是空值还是非空值. 而使用count(column)是对特定的列中 ...

  5. [VueJsDev] 基础知识 - Node.js常用函数

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html Node.js 常用函数 总结常用 node 函数 用的 E ...

  6. etcd每个节点都存储了完整的键值对数据集,为什么扩容etcd集群仍可分散存储压力?

    etcd每个节点都存储了完整的键值对数据集,这主要是为了确保数据的一致性和高可用性.在这种设计下,任何一个节点都可以处理读取请求,并在本地提供数据,从而无需跨节点通信.这种冗余的数据存储方式也增加了系 ...

  7. Git | Git Server 搭建,在自己的服务器上进行 git server 搭建

    系列文章目录 目录 系列文章目录 前言 操作 1. 创建 git 用户 2. 创建 .ssh 目录 3. 自定义仓库的根目录 4. 在服务器上创建个裸仓库 5. 手动配置一个公钥 6. 在本地测试一下 ...

  8. vue入门教程之-插槽

    vue入门教程之-插槽 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 https://www ...

  9. [vscode]使用cmake时将命令行参数传递给调试目标

    一.简介 本文介绍了在vscode中使用cmake工具时,如何传递参数给编译目标的方法. 前提:使用vscode+cmake编译C/C++程序. 二.方法 在.vscode/目录下新建settings ...

  10. 3D渲染速度慢,花重金买显卡还是用云渲染更划算

    3D渲染对建筑师和设计师来说并不陌生,3D渲染的过程中出现渲染卡顿.特殊材质难以渲染,或者本地配置不足.本地渲染资源不够时,常常会影响工作效率.本文比较了3D渲染时,为提高工作效率,买显卡还是用云渲染 ...