#postgresql #diff #database-schema #memory-safe

rust-pgdatadiff

Rust 版本的 PostgreSQL 数据库比较库

7 个版本

0.1.6 2024 年 6 月 7 日
0.1.5 2024 年 6 月 7 日
0.1.4 2024 年 4 月 10 日
0.1.2 2024 年 3 月 14 日

#374数据库接口

Download history 5/week @ 2024-04-15 59/week @ 2024-04-22 23/week @ 2024-04-29 3/week @ 2024-05-06 44/week @ 2024-05-13 162/week @ 2024-05-20 121/week @ 2024-05-27 367/week @ 2024-06-03 153/week @ 2024-06-10 33/week @ 2024-06-17 4/week @ 2024-06-24 35/week @ 2024-07-01 58/week @ 2024-07-08 9/week @ 2024-07-15 13/week @ 2024-07-22 102/week @ 2024-07-29

189 每月下载量
5 个 crates(直接 3 个) 中使用

MIT 许可证

1.5MB
2K SLoC

Rust 2K SLoC // 0.0% comments SQL 252 SLoC // 0.1% comments

Rust PGDataDiff

rust-pgdatadiff 是 Python 版本的 pgdatadiff 的重写

它的不同之处在哪里?

  • 它从一开始就具有模式意识,因为我们不得不使用原始的 pgdatadiff 时,我们最终需要检查不同模式。

  • 它以并行方式运行数据库操作,这使得它在速度上至少比原始的 pgdatadiff 快 3 倍,后者是按顺序执行检查。

  • 它是用 Rust 编写的,这意味着它是内存安全的,并且开销非常低。

  • 它提供了一个库和一个客户端,这意味着您可以用作独立工具并在自己的项目中使用它。

以下基准测试基于具有 5 个表和每个表 1M 行的数据库。结果如下

Python(顺序)

python-timings

Rust(并行)

rust-timings

安装(客户端)

如果您想将其用作客户端,可以通过 cargo 安装它

客户端支持两个功能,允许您在运行它时选择 ClapInquire

asciicast

Clap

cargo install rust-pgdatadiff-client --features with-clap

Inquire

cargo install rust-pgdatadiff-client //or with `--features with-inquire`

安装(库)

如果您想将其用作库,可以将其添加到您的 Cargo.toml

cargo add rust-pgdatadiff

[dependencies]
rust-pgdatadiff = "0.1"

使用(客户端)

Clap

Usage: rust-pgdatadiff-client diff [OPTIONS] <FIRST_DB> <SECOND_DB>

Arguments:
  <FIRST_DB>   postgres://postgres:postgres@localhost:5438/example
  <SECOND_DB>  postgres://postgres:postgres@localhost:5439/example

Options:
      --only-tables                           Only compare data, exclude sequences
      --only-sequences                        Only compare sequences, exclude data
      --only-count                            Do a quick test based on counts alone
      --chunk-size <CHUNK_SIZE>               The chunk size when comparing data [default: 10000]
      --start-position <START_POSITION>       The start position for the comparison [default: 0]
      --max-connections <MAX_CONNECTIONS>     Max connections for Postgres pool [default: 100]
  -i, --include-tables [<INCLUDE_TABLES>...]  Tables included in the comparison
  -e, --exclude-tables [<EXCLUDE_TABLES>...]  Tables excluded from the comparison
      --schema-name <SCHEMA_NAME>             Schema name [default: public]
  -h, --help                                  Print help
  -V, --version                               Print version

Inquire

rust-pgdatadiff-client

使用(库)

use rust_pgdatadiff::diff::diff_ops::Differ;
use rust_pgdatadiff::diff::diff_payload::DiffPayload;

#[tokio::main]
async fn main() -> Result<()> {
  let first_db = "postgres://postgres:postgres@localhost:5438/example";
  let second_db = "postgres://postgres:postgres@localhost:5439/example";

  let payload = DiffPayload::new(
    first_db.to_owned(),
    second_db.to_owned(),
    false, //only-tables
    false, //only-sequences
    false, //only-count
    10_000, //chunk-size
    0, //start-position
    100, //max-connections
    vec!["table1", "table2"], //include-tables (mutually exclusive with exclude-tables)
    vec!["table3", "table4"], //exclude-tables (mutually exclusive with include-tables)
    "public", //schema
  );
  let diff_result = Differ::diff_dbs(payload).await;
  // Handle `diff_result` in any way it fits your use case
  Ok(())
}

示例

您可以通过 Docker Compose 启动两个预先填充数据的数据库。

docker compose up --build

预先填充的数据库包含大量数据和行,因此您可以对它们进行基准测试以检查其性能。您可以通过修改生成的数据中的一些数据来查看其效果。

您可以在 examples 目录中找到将其用作库的示例。

启动示例的命令如下,在 Docker Compose 启动后

cargo run --example example_diff diff \
  "postgresql://127.0.0.1:5438?dbname=example&user=postgres&password=postgres" \
  "postgresql://127.0.0.1:5439?dbname=example&user=postgres&password=postgres"

您还可以通过导出以下内容启用 Rust 相关日志

export RUST_LOG=rust_pgdatadiff=info

info 切换到 debug 将提供更详细的日志。另外,由于我们在底层使用了 sqlx,您可以通过导出以下内容来启用 sqlx 日志:

export RUST_LOG=rust_pgdatadiff=info,sqlx=debug

作者

依赖项

~37–70MB
~1M SLoC