使用 PGRX 框架开发数据库扩展
本文档介绍如何使用 Rust 和 PGRX 框架开发数据库扩展。PGRX 是一个高效、安全的 Rust 框架,适用于开发 Apache Cloudberry 的数据库扩展。
PGRX 的功能说明,参考 PGRX 核心功能。PGRX 的注意事项,参考 PGRX 注意事项。
开发环境要求
- 确保您的操作系统为 Debian/Ubuntu 或 RHEL/CentOS 系统。
- 确保您的 Apache Cloudberry 集群是通过源码编译的,非通过 RPM 包安装的。
基础软件环境
-
确保已安装以下软件:
- Rust 工具链(
rustc
、cargo
和rustfmt
),建议通过 https://rustup.rs 安装 - Git
- libclang 11 或更高版本(用于 bindgen)
- GCC 7 或更高版本
- Rust 工具链(
PostgreSQL 依赖
确保已根据操作系统安装以下 PostgreSQL 依赖:
对于 Debian/Ubuntu 系统:
sudo apt-get install build-essential libreadline-dev zlib1g-dev flex bison \
libxml2-dev libxslt-dev libssl-dev libxml2-utils xsltproc ccache pkg-config
对于 RHEL/CentOS 系统:
sudo yum install -y bison-devel readline-devel zlib-devel openssl-devel wget ccache
sudo yum groupinstall -y 'Development Tools'
完成上述依赖安装后,即可开始开发扩展。
快速上手
本节介绍如何使用 PGRX 快速开发数据库扩展,主要包括:
- 配置 PGRX 环境与安装
- 创建扩展
- 安装和使用扩展
配置 PGRX 环境与安装
PGRX 由 PgCentral Foundation, Inc. 维护,但此处我们使用的版本是一个 PGRX 衍生版本,与 Cloudberry 保持了良好的兼容性。该版本是由社区成员贡献,而非 Cloudberry 官方项目。
-
为 Apache Cloudberry 的
pg_config
路径设置环境变量,其中<pg_config_path>
是 Apache Cloudberry 集群中的pg_config
路径,例如/usr/local/cloudberry-db/bin/pg_config
:export PGRX_PG_CONFIG_PATH=<pg_config_path>
-
编译 PGRX 框架:
-
克隆适配 Apache Cloudberry 的
pgrx
代码仓库:git clone https://github.com/cloudberry-contrib/pgrx
cd pgrx -
编译框架时,启用
pg14
和cbdb
:cargo build --features "pg14, cbdb"
-
-
安装已适配 Apache Cloudberry 的
cargo-pgrx
工具:cargo install --path cargo-pgrx/
-
使用数据库对应的内核版本初始化环境:
cargo pgrx init --pg14=`which pg_config`
创建扩展
-
生成扩展模板。本示例创建一个名为
my_extension
的扩展:cargo pgrx new my_extension
cd my_extension创建后的目录结构如下:
.
├── Cargo.toml
├── my_extension.control
├── sql
└── src
├── bin
│ └── pgrx_embed.rs
└── lib.rs -
修改
Cargo.toml
文件中的依赖配置,使用本地的 pgrx。-
将
[dependencies]
下pgrx = "0.12.7"
的版本号修改为 PGRX 本地仓库中pgrx
目录的路径,例如:[dependencies]
pgrx = { path = "/home/gpadmin/pgrx/pgrx/", features = ["pg14", "cbdb"] } -
在
[dependencies]
下添加pgrx-pg-sys = { path = "<local_path>", features = ["pg14", "cbdb"] }
,其中<local_path>
是 PGRX 本地仓库中pgrx-pg-sys
目录的路径,例如/home/gpadmin/pgrx/pgrx-pg-sys/
。 -
将
[dev-dependencies]
下pgrx-tests = "0.12.7"
的版本号修改为 pgrx 本地仓库中pgrx-tests
目录的路径,例如:[dev-dependencies]
pgrx-tests = { path = "/home/gpadmin/pgrx/pgrx-tests/" } -
删掉
pgrx-test = []
一行。
-
-
将扩展名
my_extension
添加至 PGRX 本地仓库中Cargo.toml
文件中workspace.members
数组中,例如:vi /home/gpadmin/pgrx/Cargo.toml
[workspace]
resolver = "2"
members = [
"cargo-pgrx",
"pgrx",
"pgrx-macros",
"pgrx-pg-config",
"pgrx-pg-sys",
"pgrx-sql-entity-graph",
"pgrx-tests",
"pgrx-bindgen",
"my_extension"
] -
为当前系统用户授予 Apache Cloudberry 目录的权限。例如当前系统用户为
gpadmin
,Apache Cloudberry 目录为/usr/local/cloudberrydb
:sudo chown -R gpadmin:gpadmin /usr/local/cloudberrydb