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 — with a paid version that writes the migration to close the gap, and the rollback to undo it.

Version 1.0 is out, with installers for Windows, macOS and Linux — what’s new.

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

Installers

From the latest release: an .msi or setup .exe for Windows, a .dmg for macOS that runs on Apple Silicon and Intel, and .deb, .rpm or .AppImage for Linux. These install the desktop app; the command-line tool is a separate archive on the same page.

They are not code-signed, so Windows and macOS warn the first time. On Windows choose More info, then Run anyway. On macOS open System Settings → Privacy & Security and click Open Anyway.

From crates.io

$ cargo install biject --locked

Arch Linux

$ yay -S biject

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 DDL that closes the gap — for PostgreSQL, MySQL or SQL Server — 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" timestamp with time zone DEFAULT now() NOT NULL;

-- Was integer. A widening: every existing value still fits.
ALTER TABLE "accounts" ALTER COLUMN "id" TYPE bigint USING "id"::bigint;

Anything that can lose data — a dropped column, or a type change that could round or truncate a value — is withheld unless you ask for it with --allow-destructive, and is reported either way. Bijection never executes SQL. It writes a file for you to read.

Buy

$39 once — perpetual for the version you buy

Plus sales tax or VAT where it applies, calculated at checkout from where you are.

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.

For Windows, macOS (Apple Silicon and Intel) and Linux. The download is the whole of Bijection plus migrate, and replaces the free biject. Checkout and payment are handled by Paddle, who sell it as merchant of record, so the charge shows as Paddle on your statement. Your licence arrives by email, within 24 hours, issued to the address you check out with. Sold under the commercial licence agreement.

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

Where it goes next

Bijection compares tables it can load, which today means tables that fit comfortably in memory — not billion-row fact tables in a warehouse. Pushing the comparison into the database is the largest item below, and everything about warehouse support waits on it. Where it cannot read something — a CSV has no catalog, SQLite hides its check constraints — the report names the gap rather than returning a clean result, so you are never guessing what a green tick covered.

Done for 1.0

  • Foreign keys on every engine — columns, the table they point at, and what happens on delete and update.
  • A report that names what it never examines, so a clean result tells you how much it covered.
  • Installers for Windows, macOS and Linux.
  • A desktop app that says what it leaves to the command line, instead of leaving you to look for it.
  • Stability promises — a semver library, and JSON and CSV exports that only ever grow.

Next

  • Checksum and sampling comparison for warehouse-scale tables — the gate on everything below.

Later

  • Cloud warehouse connectors — Snowflake, Databricks, BigQuery.
  • Cross-engine schema diff and type mapping.

Not planned, ever: a hosted or scheduled component, a subscription, an account, or any mode that executes generated DDL against a live database. There is no --apply flag and there will not be one — Bijection writes a file for you to read.