#postgresql #cluster #version #experimentation #standalone #demand

bin+lib postgresfixture

轻松按需创建和管理 PostgreSQL 集群以进行测试和开发

8 个不稳定版本 (3 个重大更改)

0.5.0 2023年10月8日
0.4.0 2023年10月8日
0.3.3 2023年2月26日
0.3.1 2022年4月9日
0.2.3 2020年3月13日

#782 in 数据库接口

每月32次下载

Apache-2.0

105KB
2K SLoC

rust-postgresfixture

A Rust 库和命令行工具,用于创建独立的 PostgreSQL 集群和数据库,适用于实验、开发和测试。

它基于 Python postgresfixture 库,在 MAAS 中得到了广泛使用。这是一个在实验 PostgreSQL 时非常有用的工具。例如,我们可以用它来启动一个集群以运行开发服务器。然而,它在 MAAS 的测试套件中发挥了作用,并有助于 使 MAAS 的测试套件更快

这个 Rust 版本最初是一个简单的端口,但它与其 Python 对应版本的设计有显著差异。

此代码似乎运行良好且可靠,但命令行和 API 在 1.0 版本之前可能会发生变化,可能造成破坏。如果这成为问题,我建议将依赖项锁定在特定版本上,并偶尔检查是否可以升级,或者使用像 Dependabot 这样的自动化工具。

命令行工具

安装 Cargo 后,cargo install postgresfixture 将在 ~/.cargo/bin 中安装一个 postgresfixture 二进制文件,Cargo 安装过程可能已将其添加到您的 PATH 中。

注意 此工具不包含任何 PostgreSQL 运行时。您必须自行安装这些并添加它们的 bin 目录到 PATH。要选择特定运行时,您必须设置 PATH,以便您想要使用的运行时在其他任何运行时之前。 runtimes 子命令可以显示可用的内容以及实际使用的运行时。

$ postgresfixture --help
Easily create and manage PostgreSQL clusters on demand for testing and development.

Usage: postgresfixture <COMMAND>

Commands:
  shell     Start a psql shell, creating and starting the cluster as necessary
  exec      Execute an arbitrary command, creating and starting the cluster as necessary
  runtimes  List discovered PostgreSQL runtimes
  help      Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

$ postgresfixture runtimes
   10.22      /opt/homebrew/Cellar/postgresql@10/10.22_6/bin
   11.21      /opt/homebrew/Cellar/postgresql@11/11.21/bin
   12.16      /opt/homebrew/Cellar/postgresql@12/12.16/bin
   13.12      /opt/homebrew/Cellar/postgresql@13/13.12/bin
   14.9       /opt/homebrew/Cellar/postgresql@14/14.9/bin
   15.4       /opt/homebrew/Cellar/postgresql@15/15.4/bin
=> 16.0       /opt/homebrew/bin

$ postgresfixture shell
postgres=# select …

$ postgresfixture exec pg_dump
--
-- PostgreSQL database dump
--
…

作为库使用

此 crate 中的基本功能在于 Cluster 结构和其实现。这涵盖了您需要创建、运行和销毁任何官方支持的版本(以及一些上游不支持的一些较旧版本)的 PostgreSQL 集群的逻辑。

use postgresfixture::prelude::*;
for runtime in strategy::default().runtimes() {
  let data_dir = tempdir::TempDir::new("data")?;
  let cluster = Cluster::new(&data_dir, runtime)?;
  cluster.start()?;
  assert_eq!(cluster.databases()?, vec!["postgres", "template0", "template1"]);
  let mut conn = cluster.connect("template1")?;
  let rows = conn.query("SELECT 1234 -- …", &[])?;
  let collations: Vec<i32> = rows.iter().map(|row| row.get(0)).collect();
  assert_eq!(collations, vec![1234]);
  cluster.stop()?;
}
# Ok::<(), ClusterError>(())

您可能想与coordinate模块中的函数一起使用,例如run_and_stoprun_and_destroy。这些函数在集群的设置和拆解步骤中添加了锁定,以便多个进程可以安全地共享一个按需集群。

贡献

如果您想对这段代码进行修改,以下是开始的步骤

  • 安装cargo,
  • 克隆此存储库,
  • 构建它:cargo build

运行测试

安装源代码(见上方)后,使用以下命令运行测试:cargo test

然而,针对多个版本的PostgreSQL进行测试非常重要。测试将查找所有在PATH上的PostgreSQL运行时,并针对所有这些运行时运行测试。

首先,您必须在您的机器上安装多个版本的PostgreSQL。请继续阅读有关特定平台的说明。安装了您想要的版本后,postgresfixture::runtime::strategy::default()可能能够自动找到它们——由于此功能由测试使用,因此这些运行时将自动进行测试。

Debian & Ubuntu

https://wiki.postgresql.ac.cn/wiki/Apt

$ sudo apt-get install -y postgresql-common
$ sudo sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
$ sudo apt-get install -y postgresql-{9.{4,5,6},10,11,12,13}  # Adjust as necessary.

macOS

使用Homebrew

$ brew install postgresql  # Latest version.
$ brew install postgresql@{9.{4,5,6},10,11,12,13}  # Adjust as necessary.

发布版本

  1. Cargo.toml中提升版本。
  2. 将更新的--help输出粘贴到README.md(此文件;参见顶部)。在macOS上,命令cargo run -- --help | pbcopy很有帮助。
  3. 构建和测试:cargo build && cargo test。后者本身也会进行构建,但测试构建可以隐藏有关无效代码的警告,因此请同时执行这两个步骤。
  4. 提交消息为“将版本提升到$VERSION”。
  5. 使用“v$VERSION”标记,例如git tag v1.0.10
  6. 推送:git push && git push --tags
  7. 发布:cargo publish

许可

本项目采用Apache 2.0许可。有关详细信息,请参阅LICENSE文件。

依赖关系

~21–32MB
~407K SLoC