引子

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. 【Azure 事件中心】EventHub 中同一条消息不停的推送给消费端问题记录

    问题描述 EventHub 中同一条消息,不停的推送给消费端,查看日志发现错误: Caused by: com.azure.messaging.eventhubs.implementation.Par ...

  2. 一文了解 Nebula Graph DBaaS 服务——Nebula Graph Cloud Service

    Nebula Graph DBaaS 作为一款 DBaaS(DataBase as s Service)的产品,Nebula Graph Cloud Service 极大地降低了研发人员使用 Nebu ...

  3. [C++逆向] 7 变量在内存中的位置和访问方式

    目录 全局变量和局部变量的区别 局部静态变量 有意思的 堆变量 变量类型 作用域 可访问 全局变量 进程作用域 整个进程可访问 静态变量 文件作用域 当前代码文件可访问 局部变量 函数作用域 函数内可 ...

  4. RPA是啥?是干嘛的?如何入门开始使用?(一)

    1.RPA是啥? 我们先对RPA有一个大概的了解,再循序渐进. Robotic Process Automation(机器人流程自动化,简称RPA). 我的简单理解就是自动化,类似于按键精灵,相对来说 ...

  5. 接口自动化有多少case?覆盖率是多少?执行完需要多久?

    case根据接口数量而定,比如两百个接口,大概有5000个用例,一个接口大概有25到30个用例,一个接口大概200ms左右响应时间 覆盖率能达到95%以上,有时候可以达到百分之百,所有接口自动化用例执 ...

  6. 宝塔Linux面板 https://www.bt.cn/ 服务器环境搭建软件

    宝塔Linux面板 https://www.bt.cn/

  7. SQL注入详细讲解概括—宽字节注入

    SQL注入详细讲解概括-宽字节注入 1.宽字节注入原理 2.宽字节注入方法 一.宽字节注入原理 What is 宽字节? 字符大小为一个字节时为窄字节 字符大小为两个及以上的字节为宽字节 英文26个字 ...

  8. XXL-JOB初探

    参考:欢迎点击原文:https://www.xuxueli.com/xxl-job/(官方) https://blog.csdn.net/f2315895270/article/details/104 ...

  9. 使用POI操作Excel时new XSSFWorkbook ()报错java.lang.NoSuchMethodError解决方案

    使用最新的POI3.11时,在运行 Workbook  workBook = new XSSFWorkbook ();这段代码时出现错误: java.lang.NoSuchMethodError: j ...

  10. .net core 多线程下使用 Random 会出现bug

    .net core 多线程下使用 Random 会出现的bug 先看原文: Working with System.Random and threads safely in .NET Core and ...