Hoppa till innehåll

Merql

Ren trevägsdatabassammanslagning i PHP med konfliktlösning på kolumnnivå. Sammanslagningssemantik av typen Git för tabeller i MySQL och SQLite.

Terminal
composer require merql/merql

Senaste versionen v0.4.1 MIT PHP 8.2+

I praktiken

En sammanslagning läser tre sparade ögonblicksbilder och returnerar operationerna som ska skrivas och konflikterna som ska lösas.

Slå ihop tre ögonblicksbilder

Ta en ögonblicksbild av basen innan de två kopiorna skiljs åt, och ta sedan en ögonblicksbild av varje sida, till exempel av en aktiv databas och en sandlåsekopia. ThreeWayMerge jämför båda sidorna med basen och slår ihop de två ändringsuppsättningarna.

På resultatfliken redigerade vår sida content och deras sida redigerade title och status i samma rad, så sammanslagningen behåller alla tre ändringarna utan konflikt.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Trevägssammanslagning

Bas, vår, deras. En trevägssammanslagning av nycklade rader och kolumner i stil med git, i stället för linjer. Identifierar infogningar, uppdateringar och borttagningar mellan två grenar.

Lösning på kolumnnivå

När båda sidor ändrar samma rad jämför merql kolumnerna var för sig. Konflikt uppstår bara när samma kolumn ändras till olika värden.

Valfri cellsammanslagning

Skicka en CellMergeConfig till ThreeWayMerge så slås TEXT-kolumner samman rad för rad med Myers diff och JSON-kolumner nyckel för nyckel. Fasaden Merql och CLI aktiverar inte detta.

Flera databaser

Anslutningsadaptrar och dialektdrivrutiner som kan anslutas, med inbyggt stöd för MySQL och SQLite.

Identifiering av konflikter

Uppdatering mot uppdatering, uppdatering mot borttagning, borttagning mot uppdatering och infogning mot infogning rapporteras var för sig med tabell och rad. Konflikter vid uppdatering mot uppdatering anger även kolumnen.

SQL-generering

Parametriserade INSERT-, UPDATE- och DELETE-satser med FK-medveten ordning. Förhandsgranska utan att köra eller tillämpa i en transaktion.

CLI

Ta ögonblicksbilder, jämför och slå samman från kommandoraden. Stöder MySQL och SQLite via miljövariabler.

Testad

32 regressionstestscenarier med handskrivna förväntade resultat (composer test:oracle). CI kör 231 enhets- och integrationstester samt PHPStan nivå 10.

Varför Merql

Ögonblicksbilder är filer

Varje ögonblicksbild är en JSON-fil som du kan kopiera mellan datorer eller checka in i versionshanteringen. Jämförelse och sammanslagning läser filerna och körs därför utan databasanslutning.

Granska innan du skriver

En sammanslagningsplan ger varje operation och ändringsgrupp ett stabilt ID och behåller basens, våra, deras och resultatets rader. Välj de grupper du vill ha och tillämpa bara dem.

Inaktuella planer stoppas

Skyddad tillämpning skriver bara till rader som fortfarande motsvarar ögonblicksbilden du granskade. Om en sats påverkar noll rader återställs transaktionen, och resultatet innehåller felet.

Återställning med driftkontroll

Skapa en återställningsplan från de aktiva raderna precis före skrivningen och spara den som JSON. Innan ändringarna ångras jämför driftkontrollen radfingeravtrycken och returnerar operationerna för de rader som har ändrats sedan dess.

Jämfört med

Merql slår ihop raddata från tre ögonblicksbilder. De här verktygen versionshanterar, synkroniserar eller migrerar databaser; det är närliggande arbetsuppgifter.

Merql jämfört med andra verktyg
Dolt Bra påDolt är en SQL-databas som du kan förgrena, klona, skapa grenar från, slå ihop, skicka och hämta från, precis som ett Git-arkiv. Du ansluter till den som till vilken MySQL-databas som helst, och den spårar varje cells härkomst. Skillnaden jämfört med MerqlMerql behåller den MySQL- eller SQLite-databas du redan kör. Den sparar tabeller som JSON-ögonblicksbildsfiler och slår ihop tre av dem, med en basögonblicksbild som du väljer.
pt-table-sync Bra påpt-table-sync hittar och åtgärdar skillnader mellan MySQL-tabeller, i en riktning eller åt båda håll mellan servrar. När verktyget synkroniserar en replik utför det ändringarna på replikeringskällan. Skillnaden jämfört med MerqlVid dubbelriktad synkronisering väljer pt-table-sync en vinnande rad utifrån en konfliktkolumn och kopierar dess värden. Merql jämför båda sidorna med en gemensam bas, slår ihop ändringar i olika kolumner på samma rad och rapporterar inkompatibla ändringar som konflikter att lösa.
sqldiff Bra påsqldiff jämför två SQLite-databaser och skriver ut ett SQL-skript som omvandlar den första till den andra. Det kan även skriva en binär ändringsuppsättning för sessionstillägget SQLite eller sammanfatta ändrade rader per tabell. Skillnaden jämfört med MerqlEn tvåvägsdiff kan inte avgöra om ena sidan lade till en rad eller den andra tog bort den. Merql lägger till en basögonblicksbild för att besvara frågan, slår ihop två ändringsuppsättningar och fungerar även med MySQL.
Doctrine Migrations Bra påDoctrine Migrations versionshanterar ditt databasschema, så schemaändringar kan granskas och testas innan de driftsätts i produktion. Skillnaden jämfört med MerqlMerql är inget verktyg för schemamigrering. Det slår ihop raddata och rapporterar kolumner som lagts till eller tagits bort mellan ögonblicksbilderna; du ansvarar själv för schemaändringen.

Frågor och svar

Korta svar från dokumentationen för Merql.

Följ guiden från den första ögonblicksbilden till sammanslagningsplaner, skyddad tillämpning och återställning.