Merql
Zuivere PHP-achtige semantiek voor Git-achtige drieweg-databasemerges met conflictresolutie op kolomniveau, toegepast op tabellen van MySQL en SQLite.
composer require merql/merqlNieuwste release v0.4.1 MIT PHP 8.2+
use Merql\Merql;
Merql::init($connection);
// Snapshot all tables.
$snapshot = Merql::snapshot('baseline');
// Snapshot specific tables.
$snapshot = Merql::snapshot('baseline', ['posts', 'comments', 'users']);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.
use Merql\Merge\ThreeWayMerge;
$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);
echo $result->operationCount(); // resolved operations
echo $result->conflictCount(); // unresolved conflictsBase: { title: "Hello", content: "Body", status: "draft" }
Ours: { title: "Hello", content: "Body v2", status: "draft" }
Theirs: { title: "New Title", content: "Body", status: "publish" }
Result: { title: "New Title", content: "Body v2", status: "publish" }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.
| Tool | Goed in | Verschil met Merql |
|---|---|---|
| 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.
MySQL en SQLite, via de PDO- of mysqli-adapters. Voor een andere engine schrijf je een klasse die de Driver-interface implementeert en registreer je die met DriverFactory::register().
Nee. De tool migreert geen schema's, repliceert geen databases en synchroniseert ze niet in realtime. Op basis van drie databasestatussen maakt deze een vierde, samengevoegde status met de geïdentificeerde conflicten.
Wanneer beide kanten dezelfde kolom van dezelfde rij in verschillende waarden wijzigen, wanneer de ene kant een rij wijzigt die de andere heeft verwijderd, of wanneer beide kanten een rij met dezelfde sleutel invoegen. Wijzigingen in verschillende kolommen van één rij worden zonder conflicten samengevoegd.
Nee. Ze lezen opgeslagen snapshotbestanden; alleen voor het maken van een snapshot en het toepassen van een resultaat is verbinding met de database nodig.
Ja. Maak een samenvoegplan, selecteer wijzigingsgroepen op basis van hun ID's en zet de selectie om in een schoon resultaat voor Merql::apply() of Merql::applyGuarded().
Alleen als je dit inschakelt door ThreeWayMerge te maken met een CellMergeConfig, zoals CellMergeConfig::auto(). Merql::merge(), Merql::plan() en de CLI behandelen elke kolomwaarde als één geheel.
Volg de handleiding vanaf je eerste snapshot tot en met samenvoegplannen, beveiligd toepassen en terugdraaien.