Bijection
Compare schemas and rows across PostgreSQL, MySQL, SQL Server, SQLite and CSV. Find the columns that moved, the types that drifted, and the rows that differ — with tolerances that understand floating point.
A maintained alternative to Datafold’s data-diff, which was archived in 2024. Free and open source under the GPL.
Real output. Two CSVs here, but a postgres:// URI works the same way.
$ biject schema --source dev.csv --target prod.csv Schema Comparison Results --------------------------- Columns added in target (2): ["churned", "email_address"] Columns removed from source (1): ["email"] No type changes across shared columns. Potential renames: - email -> email_address (confidence 0.70) Compatibility: - Backward compatible: false - Forward compatible: false - Breaking reasons: - Removed column: email
Note the rename. email did not disappear and email_address was not invented — the column moved, and Bijection says so with a confidence score instead of reporting a drop and an add.
Added, removed and retyped columns, classified by whether the change is a safe promotion, a risky conversion, or outright breaking.
Composite keys, column filters, and numeric tolerance — absolute or proportional — so a rounding difference is not reported as a change.
Token similarity finds columns that moved rather than reporting each as an unrelated drop and add.
A manifest of source and target pairs, aggregated summaries, JSON and CSV export, and exit codes that work in CI.
Assert a policy in JSON and fail the build when a migration would break compatibility.
The same engine behind a GUI, with saved connection profiles kept in your OS keychain.
$ cargo install biject
$ yay -S biject
Linux binaries for the CLI and desktop app are attached to every GitHub release.
Everything below the line is free software and stays that way. Paid functionality is only ever additional — nothing that is free today will be taken away.
| Capability | Free | Commercial |
|---|---|---|
| Schema comparison and impact classification | Yes | Yes |
| Keyed row diffs, tolerance, filters | Yes | Yes |
| Batch manifests and schema policies | Yes | Yes |
| PostgreSQL, MySQL, SQL Server, SQLite, CSV | Yes | Yes |
| Desktop application | Yes | Yes |
| migrate — generates the DDL to fix the difference | — | Yes |
| A rollback script for every migration | — | Yes |
Free tells you what differs. migrate writes the PostgreSQL DDL that closes the gap — and a rollback derived from the same plan, so the two cannot drift apart.
$ biject migrate --source dev --target prod \ --table accounts --out up.sql --rollback down.sql -- Inferred rename, confidence 0.70. If these are unrelated -- columns, replace this with a DROP and an ADD. ALTER TABLE "accounts" RENAME COLUMN "email_address" TO "email"; ALTER TABLE "accounts" ADD COLUMN "created" TEXT; -- Was DOUBLE PRECISION. Verify the cast succeeds on real data. ALTER TABLE "accounts" ALTER COLUMN "amount" TYPE BIGINT USING "amount"::BIGINT;
Destructive statements are withheld unless you ask for them with --allow-destructive, and are reported either way. Bijection never executes SQL. It writes a file for you to read.
No subscription, no account, no telemetry. Your licence is a file that verifies offline, so it works on an air-gapped build server. It covers every patch release of the version you bought, forever.
Want one before then, or have a question? [email protected].