#postgresql #connection #testing #docker #temporary #local #spawn

bin+lib pgtemp

无 Docker 的情况下启动本地 PostgreSQL 服务器进行测试

5 个版本 (3 个重大更新)

新功能 0.4.0 2024 年 8 月 17 日
0.3.0 2024 年 5 月 2 日
0.2.1 2024 年 2 月 27 日
0.2.0 2024 年 2 月 18 日
0.1.0 2024 年 2 月 16 日

#291数据库接口

Download history 253/week @ 2024-04-28 223/week @ 2024-05-05 265/week @ 2024-05-12 397/week @ 2024-05-19 433/week @ 2024-05-26 446/week @ 2024-06-02 231/week @ 2024-06-09 377/week @ 2024-06-16 90/week @ 2024-06-23 67/week @ 2024-06-30 142/week @ 2024-07-07 219/week @ 2024-07-14 106/week @ 2024-07-21 139/week @ 2024-07-28 57/week @ 2024-08-04 300/week @ 2024-08-11

每月 614 次下载
idcoop 中使用

MIT 许可协议

44KB
610

pgtemp

Coverage Status CI Status crates.io docs.rs

pgtemp 是一个 Rust 库和 CLI 工具,允许您在不使用 Docker 的情况下轻松创建临时 PostgreSQL 服务器进行测试。

pgtemp Rust 库允许您在临时目录中启动一个 PostgreSQL 服务器,并返回一个包含主机、端口、用户名和密码的完整连接 URI。

pgtemp CLI 工具允许您更简单地建立临时连接,并与任何语言一起工作:运行 pgtemp,然后在测试中连接到数据库时使用其连接 URI。 pgtemp 将为每个接收到的连接启动一个新的 postgresql 进程 并将所有内容透明地代理到临时数据库。请注意,这意味着当您在单个测试中进行多次连接时,一个连接中做出的更改在另一个连接中是不可见的,除非您正在使用 pgtemp 的 --single 模式。

pgtemp 支持通过 pg_dump 将数据库从/到 dumpfiles 加载(和在库中导出)。

请注意,大多数情况下默认的 PostgreSQL 身份验证配置(pg_hba.conf)允许所有本地连接。由于 pgtemp 只允许您创建监听在 localhost 的服务器,这意味着在大多数情况下您不需要提供密码来连接。您可以在 PgTempDBBuilder::with_config_param 中设置服务器的 hba_file 参数或使用 pgtemp 守护进程的 -o 标志将 hba_file 传递到那里。

要求

您必须安装 PostgreSQL 客户端和服务器软件包。在 Debian/Ubuntu 上,它们是 postgresql postgresql-client,在 Fedora 上它们是 postgresql postgresql-server,在 Arch Linux 上它们是 postgresql postgresql-libs。请注意,Debian/Ubuntu 将标准 PostgreSQL 二进制文件安装到自己的目录中,因此您必须将它们添加到您的路径。对于 Ubuntu GitHub Actions 运行器,它看起来像

steps:
  - name: Install postgres
    run: sudo apt-get install postgresql postgresql-client
  - name: Update path
    run: find /usr/lib/postgresql/ -type d -name "bin" >> $GITHUB_PATH

要安装 CLI 工具,您必须使用 --features cli 或 --all-features 选项安装它

cargo install pgtemp --features cli

设计

pgtemp是一个相对简单的程序,并且存在其他现有的库,如为Python的testing.postgresql为Go的pgtest,它们都以相同的方式工作。

  • 进行一些设置,例如创建临时目录和复制文件。
  • 运行initdb程序。
  • 启动PostgreSQL服务器。
  • 等待PostgreSQL启动。

pgtemp的独特之处(据我所知,尽管我在想出初始库的想法之后才了解到上述Python/Go库)是CLI/守护进程,它在每次连接时自动提供对新临时数据库的连接。

示例

CLI

$ cargo install --all-features pgtemp
# username, password, port, and database name are all configurable based on the provided connection URI
$ pgtemp postgresql://127.0.0.1:6543/mytestdb 
starting pgtemp server at postgresql://postgres:password@localhost:6543/mytestdb
$ psql postgresql://postgres:password@localhost:6543/mytestdb
psql (16.1)
Type "help" for help.

postgres=#

请参阅examples/目录以获取示例。

  • 一个使用sqlalchemy和alembic的Python示例,演示了使用pgtemp CLI的正常和单模式的使用。

use pgtemp::PgTempDB;
use sqlx::postgres::PgConnection;
use sqlx::prelude::*;

#[tokio::test]
fn cool_db_test() {
    let db = PgTempDB::async_new().await;
    let mut conn = sqlx::postgres::PgConnection::connect(&db.connection_uri())
        .await
        .expect("failed to connect to temp db");

    // ... do the rest of your test

    // db is shut down and files cleaned up upon drop at the end of the test
}

示例

  • 一个使用axum的简单diesel示例。
  • 一个更复杂的“任务队列”示例,使用触发器和LISTEN/NOTIFY与sqlx和axum。

请参阅tests/目录以获取完整的库使用说明。

依赖关系

约5-15MB
约219K SLoC