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 在 数据库接口
189 每月下载量
在 5 个 crates(直接 3 个) 中使用
1.5MB
2K SLoC
Rust PGDataDiff
rust-pgdatadiff
是 Python 版本的 pgdatadiff 的重写
它的不同之处在哪里?
-
它从一开始就具有模式意识,因为我们不得不使用原始的
pgdatadiff
时,我们最终需要检查不同模式。 -
它以并行方式运行数据库操作,这使得它在速度上至少比原始的
pgdatadiff
快 3 倍,后者是按顺序执行检查。 -
它是用 Rust 编写的,这意味着它是内存安全的,并且开销非常低。
-
它提供了一个库和一个客户端,这意味着您可以用作独立工具并在自己的项目中使用它。
以下基准测试基于具有 5 个表和每个表 1M 行的数据库。结果如下
Python(顺序)
Rust(并行)
安装(客户端)
如果您想将其用作客户端,可以通过 cargo
安装它
客户端支持两个功能,允许您在运行它时选择 Clap
或 Inquire
。
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