Bijection

See exactly what changed between two databases.

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.

A schema diff, in full

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.

What it does

Schema comparison

Added, removed and retyped columns, classified by whether the change is a safe promotion, a risky conversion, or outright breaking.

Keyed row diffs

Composite keys, column filters, and numeric tolerance — absolute or proportional — so a rounding difference is not reported as a change.

Rename detection

Token similarity finds columns that moved rather than reporting each as an unrelated drop and add.

Batch runs

A manifest of source and target pairs, aggregated summaries, JSON and CSV export, and exit codes that work in CI.

Schema contracts

Assert a policy in JSON and fail the build when a migration would break compatibility.

Desktop app

The same engine behind a GUI, with saved connection profiles kept in your OS keychain.

Install

From crates.io

$ cargo install biject

Arch Linux

$ yay -S biject

Prebuilt binaries

Linux binaries for the CLI and desktop app are attached to every GitHub release.

Free and paid

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.

CapabilityFreeCommercial
Schema comparison and impact classificationYesYes
Keyed row diffs, tolerance, filtersYesYes
Batch manifests and schema policiesYesYes
PostgreSQL, MySQL, SQL Server, SQLite, CSVYesYes
Desktop applicationYesYes
migrate — generates the DDL to fix the differenceYes
A rollback script for every migrationYes

Generate the migration, and its rollback

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.

Buy

$39 once — perpetual for the version you buy

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.

Licences available soon 30-day refund, no questions asked.

Want one before then, or have a question? [email protected].

What it is not

Worth knowing before you install

  • Not built for warehouse-scale tables. Comparison loads data locally rather than pushing checksums to the server, so it suits tables that fit comfortably in memory — not billion-row fact tables in Snowflake or BigQuery.
  • No cloud warehouse connectors. PostgreSQL, MySQL, SQL Server, SQLite and CSV today.
  • migrate generates PostgreSQL only, and refuses to write DDL for any other target rather than emitting something that will not run.
  • It never applies anything. There is no --apply flag and there will not be one.
  • Migrations cover columns, not tables or indexes. Column additions, removals, type changes and renames — not CREATE TABLE or index DDL.