Merql
Ren PHP trevejs sammenfletning af databaser med konfliktløsning på kolonneniveau. Sammenfletning efter regler som i Git for tabeller i MySQL og SQLite.
composer require merql/merqlSeneste udgivelse 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 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.
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" }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.
| Værktøj | God til | Forskel fra Merql |
|---|---|---|
| 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.
MySQL og SQLite via PDO- eller mysqli-adapterne. Til en anden motor skal du skrive en klasse, der implementerer Driver-interfacet, og registrere den med DriverFactory::register().
Nej. Det migrerer ikke skemaer, replikerer ikke databaser og synkroniserer dem ikke i realtid. Ud fra tre databasetilstande producerer det en sammenflettet fjerde tilstand med registrerede konflikter.
Når begge sider ændrer den samme kolonne i den samme række til forskellige værdier, når den ene side opdaterer en række, som den anden har slettet, eller når begge indsætter en række med samme nøgle. Ændringer i forskellige kolonner i samme række sammenflettes uden konflikter.
Nej. De læser gemte snapshotfiler, så kun det at tage et snapshot og anvende et resultat kræver forbindelse til databasen.
Ja. Opret en sammenfletningsplan, vælg ændringsgrupper efter deres ID'er, og lav valget om til et rent resultat til Merql::apply() eller Merql::applyGuarded().
Kun hvis du tilvælger det ved at oprette ThreeWayMerge med en CellMergeConfig, f.eks. CellMergeConfig::auto(). Merql::merge(), Merql::plan() og CLI behandler hver kolonneværdi som en helhed.
Følg vejledningen fra dit første snapshot til sammenfletningsplaner, Guarded Apply og tilbagerulning.