当前位置: 首页 > news >正文

PostgreSQL企业应用——Rust三剑客(pgx)

PostgreSQL企业应用——Rust三剑客(pgx)

image.png
Rust是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和类似C++,但是设计者想要在保证性能的同时提供更好的内存安全。
Rust已经逐步开始进入企业应用和操作系统的内核开发,之前听过几次openEuler的双周会,一些内核模块已经或即将使用Rust进行开发,虽然一些现代的开发语言现在还很难撼动传统的C/C++ 地位。但是像go和Rust已经开始在一些领域里面崭露头角。go的目标是取代C,而Rust则号称是C++ 的最佳接班人。
一些大企业已经开始使用Rust进行核心业务的替代,同时也开始替代一些底层的基础库。在数据库领域Rust也逐步开始完善其功能,这个系列的文章主要介绍Rust在PostgreSQL可客户端驱动(rust-postgres)、扩展插件(pgx)和过程语言(plrust)三个方面的应用实践,第一弹——pgx

rust环境搭建

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • cargo 国内镜像源
# 放到 `$HOME/.cargo/config` 文件中
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"

# 替换成你偏好的镜像源
replace-with = 'sjtu'
#replace-with = 'ustc'

# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# 中国科学技术大学
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

# 上海交通大学
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"

# rustcc社区
[source.rustcc]
registry = "git://crates.rustcc.cn/crates.io-index"

  • rustup 国内镜像源
# 清华大学
RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup

# 中国科学技术大学
RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup

# 上海交通大学
RUSTUP_DIST_SERVER=https://mirrors.sjtug.sjtu.edu.cn/rust-static/

环境要求

  • rustc (>= 1.52) and cargo
  • cargo install rustfmt
  • git
  • libclang.so
  • A relatively recent GCC which supports -dynamic-list (Linux) or -exported_symbols_list (Mac).
  • Build dependencies for PostgreSQL

范例

1.安装 cargo-pgx

首先,需要安装pgx cargo子命令。在开发和测试过程中使用。

$ cargo install cargo-pgx

2.初始化 pgx

pgx安装后需要进行初始化,初始化过程只需要一次。

$ cargo pgx init

初始化时会下载PostgreSQL的一下几个版本 v14.5, v13.8, v12.12, v11.17, v10.22

image.png

3.创建扩展

$ cargo pgx new mog_ext
$ cd mog_ext/

image.png

  • src/lib.rs
use pgx::*;

pg_module_magic!();

#[pg_extern]
fn hello_mog_ext() -> &'static str {
    "Hello, mog_ext"
}

#[cfg(any(test, feature = "pg_test"))]
#[pg_schema]
mod tests {
    use pgx::*;

    #[pg_test]
    fn test_hello_mog_ext() {
        assert_eq!("Hello, mog_ext", crate::hello_mog_ext());
    }
}

#[cfg(test)]
pub mod pg_test {
    pub fn setup(_options: Vec<&str>) {
        // perform one-off initialization when the pg_test framework starts
    }

    pub fn postgresql_conf_options() -> Vec<&'static str> {
        // return any postgresql.conf settings that are required for your tests
        vec![]
    }
}
  • mog_ext.control
comment = 'mog_ext:  Created by pgx'
default_version = '@CARGO_VERSION@'
module_pathname = '$libdir/mog_ext'
relocatable = false
superuser = false
  • Cargo.toml
[package]
name = "mog_ext"
version = "0.0.0"
edition = "2021"
rust-version = "1.58"

[lib]
crate-type = ["cdylib"]

[features]
default = ["pg13"]
pg10 = ["pgx/pg10", "pgx-tests/pg10" ]
pg11 = ["pgx/pg11", "pgx-tests/pg11" ]
pg12 = ["pgx/pg12", "pgx-tests/pg12" ]
pg13 = ["pgx/pg13", "pgx-tests/pg13" ]
pg14 = ["pgx/pg14", "pgx-tests/pg14" ]
pg_test = []

[dependencies]
pgx = "0.4.5"

[dev-dependencies]
pgx-tests = "0.4.5"

[profile.dev]
panic = "unwind"
lto = "thin"

[profile.release]
panic = "unwind"
opt-level = 3
lto = "fat"
codegen-units = 1

4.运行

cargo pgx run pg14

cargo pgx init 时安装了10~14不同的版本,安装在~/.pgx目录下:

image.png

当前启动了两个集簇data-13和data-14。

image.png

在pg14上测试rust插件

image.png

创建并运行插件

image.png

5.安装

cargo pgx install

image.png

pgx会根据当前环境便利的pg_config进行安装,因为我这里是最新的15beta1,版本不匹配因此安装失败。

附录

pgx子命令列表

image.png

相关文章:

  • C++ 笔记
  • HBuilder包装iOS APP上App Store的详细过程
  • 1.4_9 Axure RP 9 for mac 高保真原型图 - 案例8 【动态面板】浏览、翻页、回弹
  • 火狐浏览器可以使用代理吗?火狐浏览器如何搭配易路代理使用?
  • nginx配置新的SSL证书后浏览器仍显示之前的旧SSL证书
  • JavaNIO——单线程(笔记)
  • SpringBoot工程中Dubbo多协议使用方式
  • 阿里首次开源 Java 10万字八股文,Github仅一天星标就超60K
  • 凯文凯利10条人生建议,送给迷茫的你!(上)
  • The DAO事件始末
  • 工业智能网关BL110应用之六: 支持PLC,Modbus,BACnet,电表等协议列表
  • Jackson公司蛋白质印迹指南丨样品制备
  • 数字IC必学之《Skill入门教程》
  • Operator 基础原理和概念
  • Math对象常用的方法
  • ----------
  • python3.6+scrapy+mysql 爬虫实战
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 03Go 类型总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • es的写入过程
  • java概述
  • JS学习笔记——闭包
  • leetcode讲解--894. All Possible Full Binary Trees
  • Nodejs和JavaWeb协助开发
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • php的插入排序,通过双层for循环
  • Python学习笔记 字符串拼接
  • SSH 免密登录
  • vue学习系列(二)vue-cli
  • Xmanager 远程桌面 CentOS 7
  • 复杂数据处理
  • 使用parted解决大于2T的磁盘分区
  • 网页视频流m3u8/ts视频下载
  • MPAndroidChart 教程:Y轴 YAxis
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (过滤器)Filter和(监听器)listener
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [ACM] hdu 1201 18岁生日
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BZOJ1008][HNOI2008]越狱
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [flask]http请求//获取请求头信息+客户端信息
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [Java]快速入门二叉树,手撕相关面试题