Zum Inhalt springen

Merql

Reines PHP für Drei-Wege-Zusammenführungen von Datenbanken mit Konfliktlösung auf Spaltenebene. Git-ähnliche Zusammenführungsregeln für MySQL- und SQLite-Tabellen.

Terminal
composer require merql/merql

Neueste Version v0.4.1 MIT PHP 8.2+

In der Praxis

Ein Merge liest drei gespeicherte Snapshots und gibt die Schreiboperationen sowie die zu lösenden Konflikte zurück.

Drei Snapshots zusammenführen

Erstelle den Basis-Snapshot, bevor sich die beiden Kopien unterscheiden, und erstelle dann von jeder Seite einen Snapshot, zum Beispiel von einer Live-Datenbank und einer Sandbox-Kopie. ThreeWayMerge vergleicht beide Seiten mit der Basis und führt die beiden Änderungssätze zusammen.

Im Ergebnis-Tab haben wir content bearbeitet, die andere Seite title und status derselben Zeile. Deshalb behält der Merge alle drei Änderungen ohne Konflikt bei.

PHP
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

echo $result->operationCount(); // resolved operations
echo $result->conflictCount();  // unresolved conflicts

Drei-Wege-Zusammenführung

Basis, unsere Version, ihre Version. Ein Drei-Wege-Merge nach dem Vorbild von git für indizierte Zeilen und Spalten statt für Zeilen. Erkennt Einfügungen, Änderungen und Löschungen über zwei Branches hinweg.

Lösung auf Spaltenebene

Wenn beide Seiten dieselbe Zeile ändern, vergleicht merql die Spalten einzeln. Ein Konflikt entsteht nur, wenn dieselbe Spalte auf unterschiedliche Werte geändert wurde.

Optionale Zellzusammenführung

Übergib ThreeWayMerge eine CellMergeConfig, damit TEXT-Spalten zeilenweise mit Myers-Diff und JSON-Spalten Schlüssel für Schlüssel zusammengeführt werden. Die Merql-Fassade und der CLI aktivieren dies nicht.

Mehrere Datenbanken

Erweiterbare Verbindungsadapter und Dialekttreiber, MySQL und SQLite sind integriert.

Konflikterkennung

Aktualisierung gegen Aktualisierung, Aktualisierung gegen Löschung, Löschung gegen Aktualisierung und Einfügung gegen Einfügung: Jeder Konflikt wird mit Tabelle und Zeile gemeldet. Bei Konflikten zwischen Aktualisierungen wird auch die Spalte angegeben.

SQL-Generierung

Parametrisierte INSERT-, UPDATE- und DELETE-Anweisungen mit Fremdschlüssel-sortierter Reihenfolge. Vorschau im Probelauf oder Ausführung in einer Transaktion.

CLI

Snapshots erstellen, Unterschiede erkennen und Zusammenführungen über die Kommandozeile ausführen. Unterstützt MySQL und SQLite über Umgebungsvariablen.

Getestet

32 Regressionstestszenarien mit handgeschriebenen Erwartungen (composer test:oracle). Die CI führt 231 Unit- und Integrationstests sowie PHPStan auf Stufe 10 aus.

Warum Merql

Snapshots sind Dateien

Jeder Snapshot ist eine einzelne JSON-Datei, die du zwischen Rechnern kopieren oder in die Versionsverwaltung übernehmen kannst. Diff und Merge lesen diese Dateien und laufen daher ohne Datenbankverbindung.

Vor dem Schreiben prüfen

Ein Merge-Plan weist jeder Operation und Änderungsgruppe eine stabile ID zu und behält die Zeilen der Basis, unserer Seite, der anderen Seite und des Ergebnisses bei. Wähle die gewünschten Gruppen aus und wende nur diese an.

Veraltete Pläne werden gestoppt

Die abgesicherte Anwendung schreibt nur in Zeilen, die noch dem geprüften Snapshot entsprechen. Betrifft eine Anweisung keine Zeilen, wird die Transaktion zurückgerollt und das Ergebnis enthält den Fehler.

Rollback mit Driftprüfung

Erstelle kurz vor dem Schreibvorgang anhand der Live-Zeilen einen Rollback-Plan und speichere ihn als JSON. Vor dem Rückgängigmachen vergleicht die Driftprüfung die Zeilen-Fingerabdrücke und gibt die Operationen zurück, deren Zeilen sich seitdem geändert haben.

Im Vergleich zu

Merql führt Zeilendaten aus drei Snapshots zusammen. Diese Werkzeuge versionieren, synchronisieren oder migrieren Datenbanken – benachbarte Aufgaben.

Merql im Vergleich zu anderen Werkzeugen
Dolt Gut geeignet fürDolt ist eine SQL-Datenbank, die du wie ein Git-Repository forken, klonen, verzweigen, zusammenführen, pushen und pullen kannst. Du verbindest dich wie mit jeder MySQL-Datenbank damit, und sie verfolgt den Verlauf jeder Zelle. Unterschiede zu MerqlMerql behält die MySQL- oder SQLite-Datenbank bei, die du bereits verwendest. Es speichert Tabellen als JSON-Snapshot-Dateien und führt drei davon zusammen. Den Basis-Snapshot wählst du selbst.
pt-table-sync Gut geeignet fürpt-table-sync findet Unterschiede zwischen MySQL-Tabellen und behebt sie, unidirektional oder bidirektional zwischen Servern. Beim Synchronisieren eines Replikats nimmt es die Änderungen an der Replikationsquelle vor. Unterschiede zu MerqlBei einer bidirektionalen Synchronisierung wählt pt-table-sync anhand einer Konfliktspalte eine Gewinnerzeile aus und kopiert deren Werte. Merql vergleicht beide Seiten mit einer gemeinsamen Basis, führt Änderungen an unterschiedlichen Spalten derselben Zeile zusammen und meldet unvereinbare Änderungen als Konflikte, die du lösen kannst.
sqldiff Gut geeignet fürsqldiff vergleicht zwei SQLite-Datenbanken und gibt ein SQL-Skript aus, das die erste in die zweite umwandelt. Es kann auch einen binären Änderungssatz für die SQLite-Session-Erweiterung schreiben oder geänderte Zeilen pro Tabelle zusammenfassen. Unterschiede zu MerqlEin Zwei-Wege-Diff kann nicht erkennen, ob eine Seite eine Zeile hinzugefügt oder die andere sie gelöscht hat. Merql ergänzt einen Basis-Snapshot, um das festzustellen, führt zwei Änderungssätze zusammen und funktioniert auch mit MySQL.
Doctrine Migrations Gut geeignet fürDoctrine Migrations versioniert dein Datenbankschema, sodass Schemaänderungen geprüft und getestet werden können, bevor sie in der Produktion bereitgestellt werden. Unterschiede zu MerqlMerql ist kein Schema-Migrationstool. Es führt Zeilendaten zusammen und meldet zwischen Snapshots hinzugefügte oder entfernte Spalten. Die Schemaänderung liegt bei dir.

Fragen und Antworten

Kurze Antworten aus der Merql-Dokumentation.

Folge der Anleitung vom ersten Snapshot über Merge-Pläne und abgesichertes Anwenden bis zum Rollback.