Ga naar de inhoud

Merql

Zuivere PHP-achtige semantiek voor Git-achtige drieweg-databasemerges met conflictresolutie op kolomniveau, toegepast op tabellen van MySQL en SQLite.

Terminal
composer require merql/merql

Nieuwste release v0.4.1 MIT PHP 8.2+

In de praktijk

Een samenvoeging leest drie opgeslagen snapshots en geeft de bewerkingen die moeten worden weggeschreven en de conflicten die moeten worden opgelost terug.

Drie snapshots samenvoegen

Maak de basissnapshot voordat de twee kopieën uiteenlopen en maak daarna van beide kanten een snapshot, bijvoorbeeld van een live database en een sandboxkopie. ThreeWayMerge vergelijkt beide kanten met de basis en voegt de twee wijzigingssets samen.

In het resultaat-tabblad heeft onze kant content gewijzigd en hun kant title en status van dezelfde rij. De samenvoeging behoudt dus alle drie de wijzigingen zonder conflict.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Driewegsamenvoeging

Basis, onze kant, hun kant. Een git-achtige samenvoeging in drie richtingen van rijen en kolommen op basis van sleutels in plaats van regels. Detecteert invoegingen, wijzigingen en verwijderingen in twee branches.

Conflicten oplossen op kolomniveau

Wanneer beide kanten dezelfde rij wijzigen, vergelijkt merql de kolommen één voor één. Er ontstaan alleen conflicten als dezelfde kolom in verschillende waarden wordt gewijzigd.

Samenvoegen van cellen op basis van opt-in

Geef een CellMergeConfig door aan ThreeWayMerge en TEXT-kolommen worden regel voor regel samengevoegd met Myers diff, JSON-kolommen sleutel voor sleutel. De Merql-facade en de CLI schakelen dit niet in.

Meerdere databases

Uitbreidbare verbindingsadapters en dialectdrivers, met ingebouwde ondersteuning voor MySQL en SQLite.

Conflictdetectie

Wijziging versus wijziging, wijziging versus verwijdering, verwijdering versus wijziging en invoeging versus invoeging: elk conflict wordt vermeld met tabel en rij. Bij conflicten tussen wijzigingen wordt ook de kolom genoemd.

Genereren van SQL

Geparametriseerde INSERT-, UPDATE- en DELETE-instructies met een volgorde die rekening houdt met FK's. Bekijk vooraf een simulatie of pas de wijzigingen toe in een transactie.

CLI

Maak snapshots, vergelijk ze en voeg ze samen vanaf de opdrachtregel. Ondersteunt MySQL en SQLite via omgevingsvariabelen.

Getest

32 regressiescenario's met handgeschreven verwachtingen (composer test:oracle). CI voert 231 unit- en integratietests uit en controleert PHPStan op niveau 10.

Waarom Merql

Snapshots zijn bestanden

Elke snapshot is één JSON-bestand dat je tussen machines kunt kopiëren of aan versiebeheer kunt toevoegen. Vergelijken en samenvoegen leest die bestanden, dus daarvoor is geen databaseverbinding nodig.

Controleren voordat je schrijft

Een samenvoegplan geeft elke bewerking en wijzigingsgroep een stabiele ID en behoudt de rijen van de basis, onze kant, hun kant en het resultaat. Selecteer de gewenste groepen en pas alleen die toe.

Verouderde plannen worden gestopt

Beveiligd toepassen schrijft alleen naar rijen die nog overeenkomen met de snapshot die je hebt gecontroleerd. Als een instructie nul rijen raakt, wordt de transactie teruggedraaid en bevat het resultaat de fout.

Terugdraaien met een afwijkingscontrole

Maak vlak voor het schrijven een terugdraaiplan op basis van de live rijen en sla dit op als JSON. Voordat de wijzigingen ongedaan worden gemaakt, vergelijkt de afwijkingscontrole de rijvingerafdrukken en geeft deze de bewerkingen terug waarvan de rijen sindsdien zijn gewijzigd.

Vergeleken met

Merql voegt rijgegevens uit drie snapshots samen. Deze tools versiebeheer, synchroniseren of migreren databases; dat zijn aanverwante taken.

Merql vergeleken met andere tools
Dolt Goed inDolt is een SQL-database die je kunt forken, klonen, branchen, samenvoegen, pushen en pullen zoals een Git-repository. Je maakt er verbinding mee zoals met elke MySQL-database en het houdt de herkomst van elke cel bij. Verschil met MerqlMerql behoudt de MySQL- of SQLite-database die je al gebruikt. Het slaat tabellen op als JSON-snapshotbestanden en voegt er drie samen, met een basissnapshot die je zelf kiest.
pt-table-sync Goed inpt-table-sync vindt verschillen tussen MySQL-tabellen en verhelpt ze, in één richting of in beide richtingen tussen servers. Bij het synchroniseren van een replica voert het de wijzigingen door op de replicatiebron. Verschil met MerqlBij bidirectionele synchronisatie kiest pt-table-sync een winnende rij op basis van een conflictkolom en kopieert de waarden ervan. Merql vergelijkt beide kanten met een gemeenschappelijke basis, voegt wijzigingen in verschillende kolommen van dezelfde rij samen en meldt onverenigbare wijzigingen als conflicten die je kunt oplossen.
sqldiff Goed insqldiff vergelijkt twee SQLite-databases en drukt een SQL-script af dat de eerste in de tweede verandert. Het kan ook een binaire wijzigingsset schrijven voor de sessie-extensie SQLite of gewijzigde rijen per tabel samenvatten. Verschil met MerqlMet een vergelijking in twee richtingen kun je niet zien of de ene kant een rij heeft toegevoegd of de andere die heeft verwijderd. Merql voegt een basissnapshot toe om dat vast te stellen, voegt twee sets wijzigingen samen en werkt ook met MySQL.
Doctrine Migrations Goed inDoctrine Migrations beheert versies van je databaseschema, zodat schemawijzigingen kunnen worden gecontroleerd en getest voordat ze naar productie worden uitgerold. Verschil met MerqlMerql is geen tool voor schemamigraties. Het voegt rijgegevens samen en meldt welke kolommen tussen snapshots zijn toegevoegd of verwijderd; de schemaverandering voer je zelf door.

Vragen en antwoorden

Korte antwoorden uit de documentatie van Merql.

Volg de handleiding vanaf je eerste snapshot tot en met samenvoegplannen, beveiligd toepassen en terugdraaien.