duck_diff

Vergleichen Sie zwei Relationen (Tabellen, Abfragen) anhand eines Primärschlüssels und erhalten Sie pro Schlüssel den Status (identical/different/left_only/right_only), eine JSON-Zusammenfassung geänderter Spalten sowie die linken und rechten Werte je Spalte.

Maintainer: avaitla

Installation und Laden

INSTALL duck_diff FROM community;
LOAD duck_diff;

Beispiel

LOAD duck_diff;
-- Create two sample snapshots
CREATE TABLE users_v1 AS SELECT * FROM (VALUES
(1, 'Ada', '[email protected]', 100),
(2, 'Linus', '[email protected]', 50),
(3, 'Grace', '[email protected]', 75)
) t(id, name, email, credits);
CREATE TABLE users_v2 AS SELECT * FROM (VALUES
(1, 'Ada', '[email protected]', 120), -- credits changed
(2, 'Linus', '[email protected]', 50), -- unchanged
(4, 'Mike', '[email protected]', 10) -- new (id 3 removed)
) t(id, name, email, credits);
-- Diff them off the primary key
SELECT id, diff_status, diff_data, credits_left, credits_right
FROM table_diff('FROM users_v1', 'FROM users_v2', pk := 'id')
ORDER BY id;
-- Or get counts and percentages per status
SELECT * FROM table_diff_summary('FROM users_v1', 'FROM users_v2', pk := 'id');

Über duck_diff

duck_diff findet die Unterschiede zwischen zwei Tabellen — die bei Bedarf auf völlig unterschiedlichen Systemen liegen können. Typische Anwendungen:

  • Prüfen, ob eine Kopie getreu ist: CDC-Pipelines, Read Replicas, Warehouse- ELT, Migrationen. Ergebnisse pro Schlüssel zeigen veraltete Zeilen, verpasste Deletes und fehlende Inserts, die Zeilenzählungen verbergen.
  • Überprüfen, ob eine SQL-Umschreibung (Refactoring, Dialektübersetzung, Performance- Arbeit) dieselben Zeilen wie das Original zurückgibt.
  • Einem Coding-Agenten wie Claude ermöglichen, eigene Änderungen zu verifizieren: die Prüfung ist deterministisch (n_total = n_identical), sodass ein Agent umschreiben, den Diff ausführen und wiederholen kann, bis er besteht — mit Claude Codes /goal setzen Sie den wahr zurückgebenden Diff als Abschlussbedingung, und der Agent arbeitet über Turns hinweg weiter, bis das nachweislich gilt.

Jeder Schlüssel erhält einen Status (identical / different / left_only / right_only), ein JSON-diff_data der geänderten Spalten sowie Spalten <c>_left / <c>_right / <c>_diff_status. Zusammengesetzte Schlüssel werden unterstützt; upcast_types, numeric_tolerance, timestamp_precision, null_equals_empty und columns / ignore / context steuern den Vergleich über Engines hinweg.

Links: website & cross-database recipe builder · function reference · runnable demos (MySQL, Postgres, ClickHouse, BigQuery, Snowflake, Iceberg, DuckLake, S3 Tables) · AI-assisted migration guide

Funktionen:

Function Returns Purpose
table_diff(left, right, pk := ...) table one row per key: key column(s), diff_status, diff_data, expanded columns
table_diff_summary(left, right, pk := ...) one row counts (and percentages) per status
schema_diff(left, right) table per-column name/type comparison — reads no rows

Hinzugefügte Funktionen

function_name function_type description comment examples
schema_diff table NULL NULL
table_diff table NULL NULL
table_diff_summary table NULL NULL

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.