Merql
Ren trevägsdatabassammanslagning i PHP med konfliktlösning på kolumnnivå. Sammanslagningssemantik av typen Git för tabeller i MySQL och SQLite.
composer require merql/merqlSenaste versionen 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']);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.
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" }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.
| Verktyg | Bra på | Skillnaden jämfört med Merql |
|---|---|---|
| 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.
MySQL och SQLite via PDO- eller mysqli-adaptrarna. För en annan motor skriver du en klass som implementerar gränssnittet Driver och registrerar den med DriverFactory::register().
Nej. Verktyget migrerar inte scheman, replikerar inte databaser och synkroniserar dem inte i realtid. Utifrån tre databastillstånd producerar det ett fjärde, sammanslaget tillstånd där konflikterna har identifierats.
När båda sidor ändrar samma kolumn i samma rad till olika värden, när den ena sidan uppdaterar en rad som den andra tog bort eller när båda infogar en rad med samma nyckel. Ändringar i olika kolumner i samma rad slås ihop utan konflikt.
Nej. De läser sparade ögonblicksbildsfiler, så bara när du tar en ögonblicksbild eller tillämpar ett resultat ansluts verktyget till databasen.
Ja. Skapa en sammanslagningsplan, välj ändringsgrupper med deras ID:n och omvandla urvalet till ett rent resultat för Merql::apply() eller Merql::applyGuarded().
Bara om du väljer det genom att skapa ThreeWayMerge med en CellMergeConfig, till exempel CellMergeConfig::auto(). Merql::merge(), Merql::plan() och fasaden CLI behandlar varje kolumnvärde som en helhet.
Följ guiden från den första ögonblicksbilden till sammanslagningsplaner, skyddad tillämpning och återställning.