MogDB企业应用 之 Rust驱动
引子
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驱动的更多相关文章
- 《Android深度探索》(卷1)HAL与驱动开发读后感
第1章:安卓系统移植与驱动开发概述 这一章主要概括的介绍了安卓驱动开发和系统移植的主要内容,对安卓与Linux驱动做了一个总体的介绍.通过对第一章的学习,使我对Linux驱动开发有了一个感性的认识.在 ...
- RPA与AI_新技术能给企业业务流程带来怎样的价值?
RPA助力于流程自动化蜕变 RPA是Robotic Process Automation的缩写,意为: 将机器人作为虚拟劳动力,依照预先设定的程序与现有用户系统进行交互并完成设定好的任务流程.RPA可 ...
- Vue.js 2.0 和 React、Augular等其他框架的全方位对比
引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...
- Vue.js 2.0 和 React、Augular
Vue.js 2.0 和 React.Augular 引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那 ...
- vue对比其他框架
对比其他框架 React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供了响应式(Reactive)和组件化(Composable)的视图组件. 将注意力集中保 ...
- VUE 与其他常见前端框架对比
对比其他框架(转官方文档) 这个页面无疑是最难编写的,但我们认为它也是非常重要的.或许你曾遇到了一些问题并且已经用其他的框架解决了.你来这里的目的是看看 Vue 是否有更好的解决方案.这也是我们在此想 ...
- 基于VUE框架 与 其他框架间的基本对比
基于VUE框架的基本描述 与 其他框架间的基本对比 2018-11-03 11:01:14 A B React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供 ...
- 解读《德勤2017年全球CIO报告》:顶级CIO的炼成之道
文|水手 日前,德勤发布了<2016-2017年全球CIO调查报告>.在这份报告中,德勤从影响CIO为企业创造价值的能力的决定因素出发,探索了CIO为企业进行价值创造的方式,同时以CIO的 ...
- vue对比其他框架详细介绍
vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...
- Vue.js vs React vs Angular 深度对比[转]
这个页面无疑是最难编写的,但我们认为它也是非常重要的.或许你曾遇到了一些问题并且已经用其他的框架解决了.你来这里的目的是看看 Vue 是否有更好的解决方案.这也是我们在此想要回答的. 客观来说,作为核 ...
随机推荐
- HttpClient实现https调用
在HttpClient 4.x版本中引入了大量的构造器设计模式 https请求建立详解 首先建立一个信任任何密钥的策略.代码很简单,不去考虑证书链和授权类型,均认为是受信任的: class AnyTr ...
- 【Azure 应用服务】在App Service 中如何通过Managed Identity获取访问Azure资源的Token呢? 如Key Vault
问题描述 当App Service启用了Managed Identity后,Azure中的资源就可以使用此Identity访问. 如果需要显示的获取这个Token,如何实现呢? 问题解答 在App S ...
- 【Azure Redis 缓存】Azure Cache for Redis 专用终结点, 虚拟网络, 公网访问链路
问题描述 为优化Redis访问链路,对下面三种方案进行对比: 1.Redis添加到虚拟网络 2.Redis添加专用终结点 3.Redis默认公共链路 问题分析 第三种:Redis默认公共链路,顾名思义 ...
- 【Azure 应用服务】App Service / Function App 修改系统时区为中国时区的办法(Azure中所有服务的默认时间都为UTC时间,转换为北京时间需要+8小时)
问题描述 在Azure的 App Service / Function App 服务中,如果是在Windows系统中,可以通过添加Application Setting来转换为中国时间(WEBSITE ...
- Zabbix“专家坐诊”第187期问答汇总
问题一 Q:zabbix server 5.0有办法不通过脚本监控SSL证书到期时间么? A:目前还是流行通过脚本方式去获取. Q:如果是通配符证书应该怎么监控? A:通过解析域名获取对应的过期时间的 ...
- 孔夫子旧书网书籍信息得爬取并保存为json,csv,excel多种文件格式
python版本:3.7 需要得引入得包: from selenium import webdriver from selenium.common.exceptions import TimeoutE ...
- Temporary notepad
20230412 快速帮助手册 很牛的风格 https://devhints.io/vue 印记中国 https://docschina.org/ 前台本地存储数据 兼容 https://github ...
- 芯片公司Dialog产品调研简报
一 公司简介: Dialog半导体有限公司的总部位于伦敦,设有一个全球销售.研发和营销部.2013年,公司实现了9.10亿美元的营业收入,是欧洲增长速度最快的公共半导体公司之一. 二 芯片型号: ...
- 之字形打印二叉树—Java
给定一颗二叉树,逐层打印,并且每层打印的方向是不一样的,比如: 逐层打印的结果是:1 3 2 4 5 6 8 7 代码: import java.util.ArrayList; import java ...
- 记录-VueJs中如何使用Teleport组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件 但是从整个页面应用的视图上看, ...