Gå til indhold

Merql

Ren PHP trevejs sammenfletning af databaser med konfliktløsning på kolonneniveau. Sammenfletning efter regler som i Git for tabeller i MySQL og SQLite.

Terminal
composer require merql/merql

Seneste udgivelse v0.4.1 MIT PHP 8.2+

I praksis

En sammenfletning læser tre gemte snapshots og returnerer de operationer, der skal skrives, og konflikterne, der skal løses.

Sammenflet tre snapshots

Tag et snapshot af basen, før de to kopier skilles, og tag derefter et snapshot af hver side, for eksempel en aktiv database og en sandkassekopi. ThreeWayMerge sammenligner begge sider med basen og sammenfletter de to ændringssæt.

I resultatfanen redigerede vores content, mens deres redigerede title og status i den samme række, så sammenfletningen bevarer alle tre ændringer uden 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

Tovejs sammenfletning

Base, vores, deres. En trevejsfletning som i git af nøglerede rækker og kolonner i stedet for linjer. Registrerer indsættelser, opdateringer og sletninger på tværs af to grene.

Løsning på kolonneniveau

Når begge sider ændrer den samme række, sammenligner merql kolonnerne én for én. Der opstår kun konflikter, når den samme kolonne ændres til forskellige værdier.

Valgfri cellesammenfletning

Angiv en CellMergeConfig til ThreeWayMerge, så sammenflettes TEXT-kolonner linje for linje med Myers-diff, mens JSON-kolonner sammenflettes nøgle for nøgle. Facaden Merql og CLI aktiverer det ikke.

Flere databaser

Tilslutningsadaptere og dialektdrivere, der kan udskiftes, med indbygget MySQL og SQLite.

Konfliktregistrering

Opdatering mod opdatering, opdatering mod sletning, sletning mod opdatering og indsættelse mod indsættelse; hver rapporteres med tabel og række. Konflikter mellem opdateringer angiver også kolonnen.

SQL-generering

Parametriserede INSERT-, UPDATE- og DELETE-forespørgsler med rækkefølge, der tager højde for fremmednøgler. Forhåndsvisning uden ændringer eller anvendelse i en transaktion.

CLI

Opret snapshots, forskelle og sammenfletninger fra kommandolinjen. Understøtter MySQL og SQLite via miljøvariabler.

Testet

32 regressionstilfælde med håndskrevne forventninger (composer test:oracle). CI kører 231 enheds- og integrationstests samt PHPStan på niveau 10.

Hvorfor Merql

Snapshots er filer

Hvert snapshot er én JSON-fil, som du kan kopiere mellem maskiner eller indsende til versionsstyring. Diff og sammenfletning læser filerne og kan derfor køres uden forbindelse til en database.

Gennemgå før du skriver

En sammenfletningsplan giver hver operation og ændringsgruppe et stabilt ID og bevarer basis-, vores-, deres- og resultatrækkerne. Vælg de grupper, du vil have, og anvend kun dem.

Forældede planer stoppes

Guarded Apply skriver kun til rækker, der stadig stemmer overens med det snapshot, du gennemgik. Hvis en forespørgsel påvirker nul rækker, rulles transaktionen tilbage, og resultatet indeholder fejlen.

Tilbagerulning med kontrol af afvigelser

Opret en tilbagerulningsplan ud fra de aktive rækker lige før skrivningen, og gem den som JSON. Før tilbagerulning sammenligner kontrollen af afvigelser rækkernes fingeraftryk og returnerer de operationer, hvis rækker er blevet ændret siden.

Sammenlignet med

Merql sammenfletter rækkedata fra tre snapshots. Disse værktøjer versionsstyrer, synkroniserer eller migrerer databaser og løser dermed beslægtede opgaver.

Merql sammenlignet med andre værktøjer
Dolt God tilDolt er en SQL-database, som du kan forgrene, klone, oprette grene for, sammenflette, sende og hente fra ligesom et Git-arkiv. Du opretter forbindelse til den som til enhver anden MySQL-database, og den registrerer hver celle gennem historikken. Forskel fra MerqlMerql bevarer den MySQL- eller SQLite-database, du allerede bruger. Den gemmer tabeller som JSON-snapshotfiler og sammenfletter tre af dem med en base, du selv vælger.
pt-table-sync God tilpt-table-sync finder og retter forskelle mellem MySQL-tabeller, enten én vej eller i begge retninger mellem servere. Når værktøjet synkroniserer en replika, udfører det ændringerne på replikeringskilden. Forskel fra MerqlVed tovejs synkronisering vælger pt-table-sync en vinderrække ud fra en konfliktkolonne og kopierer dens værdier. Merql sammenligner begge sider med en fælles base, sammenfletter ændringer af forskellige kolonner i samme række og rapporterer uforenelige ændringer som konflikter, du kan løse.
sqldiff God tilsqldiff sammenligner to SQLite-databaser og udskriver et SQL-script, der omdanner den første til den anden. Det kan også skrive et binært ændringssæt til udvidelsen SQLite-session eller opsummere ændrede rækker pr. tabel. Forskel fra MerqlEn tovejs-diff kan ikke afgøre, om den ene side tilføjede en række, eller den anden slettede den. Merql tilføjer et basesnapshot for at besvare det spørgsmål, sammenfletter to sæt ændringer og fungerer også med MySQL.
Doctrine Migrations God tilDoctrine Migrations versionsstyrer dit databaseskema, så skemaændringer kan gennemgås og testes, før de udrulles til produktion. Forskel fra MerqlMerql er ikke et værktøj til skemamigrering. Det sammenfletter rækkedata og rapporterer kolonner, der er tilføjet eller fjernet mellem snapshots, mens du selv håndterer skemaændringen.

Spørgsmål og svar

Korte svar fra Merql-dokumentationen.

Følg vejledningen fra dit første snapshot til sammenfletningsplaner, Guarded Apply og tilbagerulning.