38 个版本
新版本 0.12.1 | 2024 年 8 月 21 日 |
---|---|
0.12.0-beta.3 | 2024 年 7 月 16 日 |
0.12.0-alpha.1 | 2024 年 3 月 1 日 |
0.11.2 | 2023 年 12 月 5 日 |
0.10.0-beta.1 | 2023 年 7 月 14 日 |
#978 in 数据库接口
9,919 每月下载量
645KB
12K SLoC
cargo-pgrx
cargo-pgrx
是一个用于管理基于 pgrx
的 Postgres 扩展的 Cargo 子命令。
在您的扩展开发过程中,您将希望使用 cargo pgrx
命令。它自动化了创建新的 Rust crate 项目、自动生成您扩展的 SQL 模式、在本地安装您的扩展以使用 Postgres 进行测试以及运行您的测试套件的过程。
您可以在此处找到其功能的视频教程:https://www.twitch.tv/videos/684087991
安装
通过 crates.io 安装
$ cargo install --locked cargo-pgrx
随着 pgrx
的新版本发布,您需要确保再次运行此命令以更新它。
请注意,PGRX 的某些功能涉及编译 C 代码,包括 cargo pgrx init
命令,因此您还需要一个用于此目的的工具链,并可能需要提供各种库。通常,Rust 需要一个 C 工具链,但不需要例如 pkg-config。
用法
$ cargo pgrx --help
Cargo subcommand for 'pgrx' to make Postgres extension development easy
Usage: cargo pgrx [OPTIONS] <COMMAND>
Commands:
init Initialize pgrx development environment for the first time
info Provides information about pgrx-managed development environment
start Start a pgrx-managed Postgres instance
stop Stop a pgrx-managed Postgres instance
status Is a pgrx-managed Postgres instance running?
new Create a new extension crate
install Install the crate as an extension into the Postgres specified by `pg_config`
package Create an installation package directory
schema Generate extension schema files
run Compile/install extension to a pgrx-managed Postgres instance and start psql
connect Connect, via psql, to a Postgres instance
test Run the test suite for this crate
get Get a property from the extension control file
cross Cargo subcommand for 'pgrx' to make Postgres extension development easy
help Print this message or the help of the given subcommand(s)
Options:
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-h, --help Print help
-V, --version Print version
环境变量
PGRX_HOME
- 如果未设置,则默认为 "${HOME}/.pgrx/"。PGRX_BUILD_FLAGS
- 在cargo pgrx run/test/install
期间设置时,这些附加标志会在构建扩展时传递给cargo build
PGRX_BUILD_VERBOSE
- 设置为 true 以启用详细的 "build.rs" 输出 -- 对调试构建问题很有用HTTPS_PROXY
- 在cargo pgrx init
期间设置,将使用这些代理设置下载 Postgres 源代码。有关更多详细信息,请参阅 env_proxy crate 文档。PGRX_IGNORE_RUST_VERSIONS
- 设置为 true 以禁用执行模式生成时进行的rustc
版本检查(模式生成要求使用与构建cargo-pgrx
时的 crate 相同的rustc
版本来生成)。
首次初始化
$ cargo pgrx init
Discovered Postgres v12.16, v13.12, v14.9, v15.4, v16.0
Downloading Postgres v14.9 from https://ftp.postgresql.org/pub/source/v14.9/postgresql-14.9.tar.bz2
Downloading Postgres v15.4 from https://ftp.postgresql.org/pub/source/v15.4/postgresql-15.4.tar.bz2
Downloading Postgres v12.16 from https://ftp.postgresql.org/pub/source/v12.16/postgresql-12.16.tar.bz2
Downloading Postgres v13.12 from https://ftp.postgresql.org/pub/source/v13.12/postgresql-13.12.tar.bz2
Downloading Postgres v16.0 from https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.bz2
Removing /home/you/.pgrx/12.16_unpack
Removing /home/you/.pgrx/14.9_unpack
Untarring Postgres v12.16 to /home/you/.pgrx/12.16_unpack
Untarring Postgres v14.9 to /home/you/.pgrx/14.9_unpack
Removing /home/you/.pgrx/15.4_unpack
Untarring Postgres v15.4 to /home/you/.pgrx/15.4_unpack
Removing /home/you/.pgrx/16.0_unpack
Untarring Postgres v16.0 to /home/you/.pgrx/16.0_unpack
Removing /home/you/.pgrx/13.12_unpack
Untarring Postgres v13.12 to /home/you/.pgrx/13.12_unpack
Removing /home/you/.pgrx/12.16
Removing /home/you/.pgrx/14.9
Renaming /home/you/.pgrx/12.16_unpack/postgresql-12.16 -> /home/you/.pgrx/12.16
Configuring Postgres v12.16
Renaming /home/you/.pgrx/14.9_unpack/postgresql-14.9 -> /home/you/.pgrx/14.9
Configuring Postgres v14.9
Removing /home/you/.pgrx/15.4
Renaming /home/you/.pgrx/15.4_unpack/postgresql-15.4 -> /home/you/.pgrx/15.4
Configuring Postgres v15.4
Removing /home/you/.pgrx/16.0
Renaming /home/you/.pgrx/16.0_unpack/postgresql-16.0 -> /home/you/.pgrx/16.0
Configuring Postgres v16.0
Removing /home/you/.pgrx/13.12
Renaming /home/you/.pgrx/13.12_unpack/postgresql-13.12 -> /home/you/.pgrx/13.12
Configuring Postgres v13.12
Compiling Postgres v16.0
Compiling Postgres v12.16
Compiling Postgres v14.9
Compiling Postgres v15.4
Compiling Postgres v13.12
Installing Postgres v12.16 to /home/you/.pgrx/12.16/pgrx-install
Installing Postgres v13.12 to /home/you/.pgrx/13.12/pgrx-install
Installing Postgres v14.9 to /home/you/.pgrx/14.9/pgrx-install
Installing Postgres v15.4 to /home/you/.pgrx/15.4/pgrx-install
Installing Postgres v16.0 to /home/you/.pgrx/16.0/pgrx-install
Validating /home/you/.pgrx/12.16/pgrx-install/bin/pg_config
Validating /home/you/.pgrx/13.12/pgrx-install/bin/pg_config
Validating /home/you/.pgrx/14.9/pgrx-install/bin/pg_config
Validating /home/you/.pgrx/15.4/pgrx-install/bin/pg_config
Validating /home/you/.pgrx/16.0/pgrx-install/bin/pg_config
必须运行一次 cargo pgrx init
以正确配置 pgrx
开发环境。
如上图所示,它下载支持的所有 Postgres 版本的最新版本,为调试进行配置,使用断言编译它们,并将它们安装到 "${PGRX_HOME}"。这包括与 Postgres 一起提供的所有 contrib
扩展和工具。其他 cargo pgrx
命令,如 run
和 test
,将代表您管理和使用这些安装。
pgrx
设计为以支持多种 Postgres 版本的方式,这样在开发过程中,您就会知道是否正在尝试使用所有版本都不通用的 Postgres API。它还设计为使测试扩展对这些版本变得容易。这就是它启用调试符号和数据库断言的原因,也是它期望在开发期间安装所有支持的 Postgres 版本的原因。
当默认端口不是 pgrx 在其中运行 PostgreSQL 的可用端口时,可以在初始化期间使用 --base-port
和 --base-testing-port
选项指定自定义值。这种用法之一是在同时开发多个扩展时使用多个 pgrx 安装(使用不同的 "$PGRX_HOME")。这些值可以在 "$PGRX_HOME/config.toml" 中稍后更改。
如果您想使用操作系统包管理器安装 Postgres,cargo pgrx init
具有可选参数,允许您指定它们的安装位置(见下文)。请注意,这可能导致与 cargo-pgrx 编译的数据库不同的行为,其中本应由内部 Postgres 断言失败的测试现在成功通过。如果您直接使用 pgrx-pg-sys
,这可能是一个问题,因为这些断言通常是唯一可以捕获直接误用 Postgres 扩展 API 的事情!
每个版本都指定为 "--pg${VER}
以及该版本的 pg_config
的完整路径。对于您指定的任何版本,cargo pgrx init
将跳过下载/编译/安装它。cargo-pgrx 将像使用它自己编译和安装的任何版本一样使用该本地安装的版本。
然而,如果“pg_config的路径”是字面字符串 download
,则 cargo-pgrx 将为您下载和编译该版本的 Postgres。当指定任何 "--pg${VER}"
选项时,这些是 cargo-pgrx 将为您管理的 唯一 Postgres 版本。
您还需要确保为每个您想要自行管理的版本安装了“postgresql-server-dev”包。如果您需要自定义 Postgres 编译的配置,可以使用 --configure-flag
传递选项到 configure
脚本。例如,您可以使用 --configure-flag=--with-ssl=openssl
来启用 SSL 支持,或使用 --configure-flag=--with-libraries=/path/to/libs
来使用非标准位置的依赖库。此标志可以多次使用以传递多个配置选项。
完成后,cargo pgrx init
还会创建 "${PGRX_HOME}/config.toml",该文件描述了如何找到每个版本的 pg_config
工具。
如果将来发布了新的 Postgres 小版本,您可以简单地再次运行 cargo pgrx init [args]
,您的本地版本将更新,保留所有现有数据库和配置。
$ cargo pgrx init -h
Initialize pgrx development environment for the first time
Usage: cargo pgrx init [OPTIONS]
Options:
--pg12 <PG12> If installed locally, the path to PG12's `pgconfig` tool, or `download`
to have pgrx download/compile/install it [env: PG12_PG_CONFIG=]
--pg13 <PG13> If installed locally, the path to PG13's `pgconfig` tool, or `download`
to have pgrx download/compile/install it [env: PG13_PG_CONFIG=]
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
--pg14 <PG14> If installed locally, the path to PG14's `pgconfig` tool, or `download`
to have pgrx download/compile/install it [env: PG14_PG_CONFIG=]
--pg15 <PG15> If installed locally, the path to PG15's `pgconfig` tool, or `download`
to have pgrx download/compile/install it [env: PG15_PG_CONFIG=]
--pg16 <PG16> If installed locally, the path to PG16's `pgconfig` tool, or `download`
to have pgrx download/compile/install it [env: PG16_PG_CONFIG=]
--base-port <BASE_PORT> Base port number
--base-testing-port <BASE_TESTING_PORT> Base testing port number
--configure-flag <CONFIGURE_FLAG> Additional flags to pass to the configure script
--valgrind Compile PostgreSQL with the necessary flags to detect a good amount of
memory errors when run under Valgrind
-j, --jobs <JOBS> Allow N make jobs at once
-h, --help Print help (see more with '--help')
-V, --version Print version
创建新的扩展
$ cargo pgrx new example
$ ls example/
Cargo.toml example.control sql src
cargo pgrx new <extname>
是开始创建新扩展的简单方法。它与 cargo new <name>
类似,但做了支持构建 Rust Postgres 扩展所需的额外操作。
如果您想创建一个“后台工作者”,请指定 --bgworker
参数。
cargo pgrx new
不会将目录初始化为 git 仓库,但它会创建一个 .gitignore
文件,以防您决定这样做。
工作区用户:
cargo pgrx new $NAME
将创建一个$NAME/.cargo/config.toml
,您应该将其移动到工作区根目录下的.cargo/config.toml
。如果您不这样做,您可能会在像 Rust-Analyzer 这样的工具中使用时遇到不必要的重建,因为它将使用错误的
rustflags
选项。
$ cargo pgrx new --help
cargo-pgrx-new 0.5.0
PgCentral Foundation, Inc. <[email protected]>
Create a new extension crate
USAGE:
cargo pgrx new [OPTIONS] <NAME>
ARGS:
<NAME> The name of the extension
OPTIONS:
-b, --bgworker Create a background worker template
-h, --help Print help information
-v, --verbose Enable info logs, -vv for debug, -vvv for trace
-V, --version Print version information
管理您的 Postgres 安装
$ cargo pgrx status all
Postgres v12 is stopped
Postgres v13 is stopped
Postgres v14 is stopped
Postgres v15 is stopped
Postgres v16 is stopped
$ cargo pgrx start all
Starting Postgres v12 on port 28812
Starting Postgres v13 on port 28813
Starting Postgres v14 on port 28814
Starting Postgres v15 on port 28815
Starting Postgres v15 on port 28816
$ cargo pgrx status all
Postgres v12 is running
Postgres v13 is running
Postgres v14 is running
Postgres v15 is running
Postgres v16 is running
$ cargo pgrx stop all
Stopping Postgres v12
Stopping Postgres v13
Stopping Postgres v14
Stopping Postgres v15
Stopping Postgres v16
cargo pgrx
提供了三个用于管理Postgres安装的命令:start
、stop
和status
。此外,cargo pgrx run
(见下文)如果目标Postgres实例尚未运行,将自动启动它。请注意,当指定使用"all"
Postgres实例时,这将在其Cargo.toml中的扩展pg{MAJOR}
功能方面进行解释,除了cargo pgrx status
。
启动Postgres实例时,pgrx
将其启动在端口28800 + PG_MAJOR_VERSION
上,因此Postgres 15在28815
上运行,16在28816
上运行,依此类推。此外,首次启动这些中的任何一个时,它将在"${PGRX_HOME}"/data-{12,13,14,15,16}
中初始化PGDATA
目录。这样做允许pgrx
管理它安装的Postgres版本或您电脑上已有的版本,并确保pgrx
管理的版本不会干扰已运行的版本。实例的区域设置为C.UTF-8
(或在macOS上等效于具有ctype
的UTF8
的C
区域),如果C.UTF-8
区域不可用,则为C
。
pgrx
不会拆除这些实例。虽然PGRX_HOME
默认是一个隐藏目录,但pgrx
认为这些是重要的永久性数据库安装。
一旦启动,您可以使用(如果可用)psql
连接,如下所示:psql -p 28816
。然而,您可能只想使用cargo pgrx run
命令。
编译和运行您的扩展
$ cargo pgrx run pg13
building extension with features ``
"cargo" "build" "--message-format=json-render-diagnostics"
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
installing extension
Copying control file to /home/ana/.pgrx/13.5/pgrx-install/share/postgresql/extension/strings.control
Copying shared library to /home/ana/.pgrx/13.5/pgrx-install/lib/postgresql/strings.so
Building for SQL generation with features ``
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Discovering SQL entities
Discovered 6 SQL entities: 0 schemas (0 unique), 6 functions, 0 types, 0 enums, 0 sqls, 0 ords, 0 hashes, 0 aggregates
Writing SQL entities to /home/ana/.pgrx/13.5/pgrx-install/share/postgresql/extension/strings--0.1.0.sql
Finished installing strings
Starting Postgres v13 on port 28813
Re-using existing database strings
psql (13.5)
Type "help" for help.
strings=# DROP EXTENSION strings;
ERROR: extension "strings" does not exist
strings=# CREATE EXTENSION strings;
CREATE EXTENSION
strings=# \df strings.*
List of functions
Schema | Name | Result data type | Argument data types | Type
---------+---------------+------------------+------------------------------------------+------
strings | append | text | input text, extra text | func
strings | return_static | text | | func
strings | split | text[] | input text, pattern text | func
strings | split_set | SETOF text | input text, pattern text | func
strings | substring | text | input text, start integer, "end" integer | func
strings | to_lowercase | text | input text | func
(6 rows)
strings=# select strings.to_lowercase('PGRX');
to_lowercase
--------------
pgrx
(1 row)
cargo pgrx run <pg12 | pg13 | pg14 | pg15 | pg16>
是编译和开发期间交互式测试/使用您的扩展的主要接口。
第一次执行 cargo pgrx run pgXX
命令时,需要编译您的扩展,同时还要编译 pgrx 本身及其所有依赖。根据您的计算机配置,这个过程可能需要一些时间(当计算为 Postgres 生成的绑定时,pgrx
约有 20 万行 Rust 代码)。然而,之后(如上图所示),速度相当快。
cargo pgrx run
命令将编译您的扩展,并根据 pg_config
工具描述将其安装到指定的 Postgres 安装目录,使用与 cargo pgrx start pgXX
相同的过程启动该 Postgres 实例,并将您放入连接到数据库的 psql
命令行界面,默认情况下,数据库名称与您的扩展名称相同。从那里开始,您可以根据需要创建和使用您的扩展。
这也是 pgrx
自动通过 sql-generator
二进制文件为您扩展生成 SQL 架构的阶段。
当您退出 psql
时,Postgres 实例将在后台继续运行。
对于已安装在您计算机上的 Postgres 安装,cargo pgrx run
命令需要写入 pg_config --pkglibdir
和 pg_config --sharedir
描述的目录的权限。您需要决定如何实现这一点。虽然单个 Postgres 安装可以在不同的端口和不同的数据目录上启动多次,但它不支持多个“扩展库目录”。
$ cargo pgrx run --help
Compile/install extension to a pgrx-managed Postgres instance and start psql
Usage: cargo pgrx run [OPTIONS] [PG_VERSION] [DBNAME]
Arguments:
[PG_VERSION] Do you want to run against pg12, pg13, pg14, pg15, pg16, or pg17? [env: PG_VERSION=]
[DBNAME] The database to connect to (and create if the first time). Defaults to a database with the same name as the current extension name
Options:
-p, --package <PACKAGE> Package to build (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-r, --release Compile for release mode (default is debug)
--profile <PROFILE> Specific profile to use (conflicts with `--release`)
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
-F, --features <FEATURES> Space-separated list of features to activate
--pgcli Use an existing `pgcli` on the $PATH [env: PGRX_PGCLI=]
-h, --help Print help
-V, --version Print version
连接到数据库
$ cargo pgrx connect
Re-using existing database strings
psql (13.5)
Type "help" for help.
strings=# select strings.to_lowercase('PGRX');
to_lowercase
--------------
pgrx
(1 row)
strings=#
如果您只想连接到已管理的 Postgres 版本,而不重新编译和安装您的扩展,请使用 cargo pgrx connect <pg12 | pg13 | pg14 | pg15 | pg16>
。
此命令将使用默认数据库(以您的扩展名称命名),或者您可以在最后一个参数中指定另一个数据库名称。
如果指定的数据库不存在,cargo pgrx connect
将创建它。同样,如果指定的 Postgres 版本没有运行,它将自动启动。
$ cargo pgrx connect --help
Connect, via psql, to a Postgres instance
Usage: cargo pgrx connect [OPTIONS] [PG_VERSION] [DBNAME]
Arguments:
[PG_VERSION] Do you want to run against pg12, pg13, pg14, pg15, pg16, or pg17 [env: PG_VERSION=]
[DBNAME] The database to connect to (and create if the first time). Defaults to a database with the same name as the current extension name [env: DBNAME=]
Options:
-p, --package <PACKAGE> Package to determine default `pg_version` with (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
--pgcli Use an existing `pgcli` on the $PATH [env: PGRX_PGCLI=]
-h, --help Print help
-V, --version Print version
本地安装您的扩展
$ cargo pgrx install
building extension with features ``
"cargo" "build" "--message-format=json-render-diagnostics"
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
installing extension
Copying control file to /usr/share/postgresql/13/extension/strings.control
Copying shared library to /usr/lib/postgresql/13/lib/strings.so
Building for SQL generation with features ``
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
Discovering SQL entities
Discovered 6 SQL entities: 0 schemas (0 unique), 6 functions, 0 types, 0 enums, 0 sqls, 0 ords, 0 hashes, 0 aggregates
Writing SQL entities to /usr/share/postgresql/13/extension/strings--0.1.0.sql
Finished installing strings
如果出于某种原因,您不喜欢使用 cargo pgrx run <PG_VERSION>
,您可以使用 cargo pgrx install
将您的扩展安装到当前由 pg_config
工具描述的 Postgres 安装中,该工具目前位于您的 $PATH
中。
您需要 pg_config --pkglibdir
和 pg_config --sharedir
的写入权限。如果这有问题,请考虑使用 cargo pgrx install --sudo
,它会以当前用户身份编译扩展,并使用 sudo
将扩展文件复制到正确的位置,并提示您输入密码。
默认情况下,cargo pgrx install
以调试模式构建您的扩展。指定 --release
将改变这一点。
$ cargo pgrx install --help
Install the extension from the current crate to the Postgres specified by whatever `pg_config` is currently on your $PATH
Usage: cargo pgrx install [OPTIONS]
Options:
-p, --package <PACKAGE> Package to build (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-r, --release Compile for release mode (default is debug)
--profile <PROFILE> Specific profile to use (conflicts with `--release`)
--test Build in test mode (for `cargo pgrx test`)
-c, --pg-config <PG_CONFIG> The `pg_config` path (default is first in $PATH)
-s, --sudo Use `sudo` to install the extension artifacts
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
-F, --features <FEATURES> Space-separated list of features to activate
-h, --help Print help
-V, --version Print version
测试您的扩展
$ cargo pgrx test
"cargo" "test" "--features" " pg_test"
Finished test [unoptimized + debuginfo] target(s) in 0.07s
Running unittests (target/debug/deps/spi-312296af509607bc)
running 2 tests
building extension with features ` pg_test`
"cargo" "build" "--features" " pg_test" "--message-format=json-render-diagnostics"
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
installing extension
Copying control file to /home/ana/.pgrx/13.5/pgrx-install/share/postgresql/extension/spi.control
Copying shared library to /home/ana/.pgrx/13.5/pgrx-install/lib/postgresql/spi.so
Building for SQL generation with features ` pg_test`
Finished test [unoptimized + debuginfo] target(s) in 0.07s
Discovering SQL entities
Discovered 11 SQL entities: 1 schemas (1 unique), 8 functions, 0 types, 0 enums, 2 sqls, 0 ords, 0 hashes, 0 aggregates
Writing SQL entities to /home/ana/.pgrx/13.5/pgrx-install/share/postgresql/extension/spi--0.0.0.sql
Finished installing spi
test tests::pg_test_spi_query_by_id_direct ... ok
test tests::pg_test_spi_query_by_id_via_spi ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.61s
Stopping Postgres
cargo pgrx test ${VERSION}
将运行您的 #[test]
和 #[pg_test]
标注函数,使用 cargo 的测试系统。请注意,如果您请求 cargo pgrx test all
,这将只运行为 cargo-pgrx 配置的版本以及设置在您的扩展 Cargo.toml 中的 pgrx 库的测试。
在测试过程中,pgrx
将启动一个临时的 Postgres 实例,其 PGDATA
目录位于 ./target/pgrx-test-data-PGVER/
。这个 Postgres 实例在测试框架完成后立即停止。临时实例的区域设置为 C.UTF-8
(或者在 macOS 上,等效于具有 ctype
的 UTF8
的 C
区域),如果 C.UTF-8
区域不可用,则使用 C
。
输出是标准的 "cargo test" 输出和一些 Postgres 日志输出。在测试失败的情况下,失败报告将包括特定测试生成的任何 Postgres 日志消息。
Rust #[test]
函数表现正常,而 #[pg_test]
函数则在 Postgres 实例内部运行,并拥有访问所有 Postgres 内部结构的完整权限。所有测试都并行运行,无论它们的类型。
此外,一个 #[pg_test]
函数在一个事务中运行,当测试完成时会终止事务。因此,它对数据库所做的任何更改都不会被保留。
管理方面的说明是,可以使用 --runas
和 --pgdata
选项来控制用于运行测试执行单独的 postmaster
进程的操作系统用户。如果使用 --runas
,则可能还需要将 --pgdata
设置为该用户可读可写的基目录 -- 默认的 PGDATA 目录位于 ./target/pgrx-test-pgdata
,将具有运行 cargo pgrx test
的用户的权限,并且不能被 --runas
用户 chown。
$ cargo pgrx test --help
Run the test suite for this crate
Usage: cargo pgrx test [OPTIONS] [PG_VERSION] [TESTNAME]
Arguments:
[PG_VERSION] Do you want to run against pg12, pg13, pg14, pg15, pg16, pg17 or all? [env: PG_VERSION=]
[TESTNAME] If specified, only run tests containing this string in their names
Options:
-p, --package <PACKAGE> Package to build (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-r, --release compile for release mode (default is debug)
--profile <PROFILE> Specific profile to use (conflicts with `--release`)
-n, --no-schema Don't regenerate the schema
--runas <USER> Use `sudo` to initialize and run the Postgres test instance as this system user
--pgdata <DIR> Initialize the test database cluster here, instead of the default location. If used with `--runas`, then it must be writable by the user
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
-F, --features <FEATURES> Space-separated list of features to activate
-h, --help Print help
-V, --version Print version
构建安装包
$ cargo pgrx package
building extension with features ``
"cargo" "build" "--release" "--message-format=json-render-diagnostics"
Finished release [optimized] target(s) in 0.07s
installing extension
Copying control file to target/release/spi-pg13/usr/share/postgresql/13/extension/spi.control
Copying shared library to target/release/spi-pg13/usr/lib/postgresql/13/lib/spi.so
Building for SQL generation with features ``
Finished release [optimized] target(s) in 0.07s
Discovering SQL entities
Discovered 8 SQL entities: 0 schemas (0 unique), 6 functions, 0 types, 0 enums, 2 sqls, 0 ords, 0 hashes, 0 aggregates
Writing SQL entities to target/release/spi-pg13/usr/share/postgresql/13/extension/spi--0.0.0.sql
Finished installing spi
cargo pgrx package [--debug]
在 --release
模式下构建您的扩展,到一个目录结构中,位于 ./target/[debug | release]/extension_name-PGVER
,使用来自您的 pg_config
工具的 Postgres 安装路径信息。
目的是您将切换到该目录并构建一个 tarball 或 .deb 或 .rpm 包。
cargo pgrx package
创建的目录结构从文件系统的根目录开始,因为可能安装的版本管理器会将 pg_config --pkglibdir
和 pg_config --sharedir
分割成不同的基路径。
(在上面的示例截图中,使用 cargo pgrx package
使用手动安装的 Postgres 12 版本构建目录结构。)
此命令可以从 Dockerfile 中使用,例如,用于自动构建各种 Linux 发行版或 MacOS Postgres 安装程序的安装包。
$ cargo pgrx package --help
Create an installation package directory
Usage: cargo pgrx package [OPTIONS]
Options:
-p, --package <PACKAGE> Package to build (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-d, --debug Compile for debug mode (default is release)
--profile <PROFILE> Specific profile to use (conflicts with `--debug`)
--test Build in test mode (for `cargo pgrx test`)
-c, --pg-config <PG_CONFIG> The `pg_config` path (default is first in $PATH)
--out-dir <OUT_DIR> The directory to output the package (default is `./target/[debug|release]/extname-pgXX/`)
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
-F, --features <FEATURES> Space-separated list of features to activate
-h, --help Print help
-V, --version Print version
检查您的扩展模式
如果您只想查看 pgrx 将生成的完整扩展模式,请使用 cargo pgrx schema
。
$ cargo pgrx schema --help
Generate extension schema files
Usage: cargo pgrx schema [OPTIONS] [PG_VERSION]
Arguments:
[PG_VERSION] Do you want to run against pg12, pg13, pg14, pg15, pg16, or pg17?
Options:
-p, --package <PACKAGE> Package to build (see `cargo help pkgid`)
--manifest-path <MANIFEST_PATH> Path to Cargo.toml
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
--test Build in test mode (for `cargo pgrx test`)
-r, --release Compile for release mode (default is debug)
--profile <PROFILE> Specific profile to use (conflicts with `--release`)
-c, --pg-config <PG_CONFIG> The `pg_config` path (default is first in $PATH)
--all-features Activate all available features
--no-default-features Do not activate the `default` feature
-F, --features <FEATURES> Space-separated list of features to activate
-o, --out <OUT> A path to output a produced SQL file (default is `stdout`)
-d, --dot <DOT> A path to output a produced GraphViz DOT file
--skip-build Skip building a fresh extension shared object
-h, --help Print help
-V, --version Print version
扩展版本升级脚本
使用cargo pgrx new foo
创建pgrx扩展时,新扩展模板目录树中包含一个名为./sql
的目录。
$ tree
.
├── Cargo.toml
├── blah.control
├── sql
└── src
└── lib.rs
2 directories, 3 files
您将在这个目录中手动创建扩展版本升级脚本。您创建的文件应按照Postgres 扩展更新文档中规定的方式进行命名。通常格式为foo--oldver--newver.sql
。例如,foo--1.0.0--1.0.1.sql
。
当用户在一个具有foo
扩展的数据库中运行ALTER EXTENSION foo UPDATE;
时,Postgres会构建一个升级脚本图,从当前安装的版本开始,以扩展.control
文件中定义的default_version
结束。然后Postgres将沿着最短路径执行这些脚本。
您负责以任何允许Postgres从当前版本更新到下一个版本的方式手动编写这些扩展升级脚本。pgrx没有自动生成这些脚本的能力。
虽然pgrx不生成这些升级脚本,但它现在知道它们,并且所有生成扩展工件(如cargo pgrx test/run/install/package
)的pgrx命令都会自动将这些文件从./sql
目录复制到由pg_config
指定的最终目的地。
关于pgx管理的开发环境信息
$ cargo pgrx info --help
Provides information about pgrx-managed development environment
Usage: cargo pgrx info [OPTIONS] <COMMAND>
Commands:
path Print path to a base version of Postgres build
pg-config Print path to pg_config for a base version of Postgres
version Print specific version for a base Postgres version
help Print this message or the help of the given subcommand(s)
Options:
-v, --verbose... Enable info logs, -vv for debug, -vvv for trace
-h, --help Print help
-V, --version Print version
cargo pgx info
帮助检索有关pgx管理的开发环境(如管理的Postgres安装)的信息。
实验性:版本化共享对象支持
pgrx
实验性地支持生成版本化共享库的选项。这允许并行安装扩展的多个版本,并可以启用在扩展版本之间弃用(和删除)函数。在使用此功能时必须注意一些注意事项。因此,目前它是实验性的。
激活
通过从扩展的.control
文件中删除module_pathname
配置值来启用版本化共享对象支持。
概念
Postgres有一个隐含的要求,即C扩展必须在版本之间保持ABI兼容性。这个功能的背后想法是,当新版本与旧版本不兼容时,允许两个版本的扩展之间的互操作性。
操作的机制是对共享库文件名进行版本化,并将函数定义硬编码为指向版本化的共享库文件。如果没有版本化共享对象支持,C函数的SQL定义将如下所示:
CREATE OR REPLACE FUNCTION "hello_extension"() RETURNS text /* &str */
STRICT
LANGUAGE c /* Rust */
AS 'MODULE_PATHNAME', 'hello_extension_wrapper';
MODULE_PATHNAME
在 Postgres 中被配置文件 .control
中的配置值所替换。对于基于 pgrx 的扩展,这通常被设置为 $libdir/<extension-name>
。
当使用版本化共享对象支持时,相同的 SQL 将如下所示
CREATE OR REPLACE FUNCTION "hello_extension"() RETURNS text /* &str */
STRICT
LANGUAGE c /* Rust */
AS '$libdir/extension-0.0.0', 'hello_extension_wrapper';
请注意,版本化的共享库在函数定义中是硬编码的。这对应于 extension-0.0.0.so
文件,这是 pgrx
生成的。
需要注意的是,生成的 SQL 是与版本相关的。这意味着所有之前定义的 C 函数必须在版本升级脚本中重新定义,以指向当前版本化的 so。例如,当将扩展版本更新到 0.1.0 时,共享对象将被命名为 <extension-name>-0.1.0.so
,并且 cargo pgrx schema
将为上述函数生成以下 SQL
CREATE OR REPLACE FUNCTION "hello_extension"() RETURNS text /* &str */
STRICT
LANGUAGE c /* Rust */
AS '$libdir/extension-0.1.0', 'hello_extension_wrapper';
此 SQL 必须用于从 0.0.0
到 0.1.0
的升级脚本中,以便将 hello_extension
函数指向新的共享对象。 pgrx
不会 进行任何魔术操作来确定函数是在哪个版本中引入或修改的,并且只会将其放置在相应的版本化 so 文件中。通过扩展,您可以始终预期共享库将包含 所有 在扩展源代码中定义的函数。
此功能并非旨在帮助数据类型的向后兼容性。
@MODULE_PATHNAME@
模板化
如果您已经为 Rust 函数提供了自定义的 SQL 定义,您可以在自定义 SQL 中使用 @MODULE_PATHNAME@
模板。此值将被替换为实际共享对象的路径。
以下示例说明了这是如何工作的
#[pg_extern(sql = r#"
CREATE OR REPLACE FUNCTION tests."overridden_sql_with_fn_name"() RETURNS void
STRICT
LANGUAGE c /* Rust */
AS '@MODULE_PATHNAME@', '@FUNCTION_NAME@';
"#)]
fn overridden_sql_with_fn_name() -> bool {
true
}
注意事项
有一些场景与这个功能完全不兼容,因为它们依赖于 Postgres 中的某些全局状态,所以加载两个版本的共享库将导致问题。
这些场景包括
- 当使用共享内存时
- 当使用查询计划钩子时
依赖项
~27–41MB
~736K SLoC