Merql
Čisto PHP trismerno združevanje zbirk podatkov z razreševanjem konfliktov na ravni stolpcev. Semantika združevanja v slogu Git za tabele MySQL in SQLite.
composer require merql/merqlNajnovejša izdaja 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']);V praksi
Združevanje prebere tri shranjene posnetke in vrne operacije za zapis ter konflikte za razrešitev.
Združite tri posnetke
Ustvarite osnovni posnetek, preden se kopiji razideta, nato pa zajemite posnetek vsake strani, na primer žive zbirke podatkov in peskovniške kopije. ThreeWayMerge primerja obe strani z osnovo in združi oba nabora sprememb.
V zavihku z rezultatom je ours uredil content, theirs pa title in status iste vrstice, zato združevanje ohrani vse tri spremembe brez konflikta.
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" }Trismerno združevanje
Base, ours, theirs. Trismerno združevanje v slogu git nad vrsticami in stolpci s ključi namesto vrsticami besedila. Zazna vstavljanja, posodobitve in brisanja v dveh vejah.
Razreševanje na ravni stolpcev
Ko obe strani spremenita isto vrstico, merql primerja stolpec za stolpcem. Do konflikta pride samo, če je isti stolpec spremenjen na različni vrednosti.
Izbirno združevanje celic
Posredujte CellMergeConfig v ThreeWayMerge in stolpci TEXT se združujejo po vrsticah z Myersovo razliko, stolpci JSON pa po ključih. Vmesnik facade Merql in CLI tega ne omogočata.
Več zbirk podatkov
Vtični povezovalni adapterji in gonilniki za dialekte, vključno z vgrajenima MySQL in SQLite.
Zaznavanje konfliktov
Posodobitev proti posodobitvi, posodobitev proti izbrisu, izbris proti posodobitvi in vstavitev proti vstavitvi; vsak primer je naveden skupaj s tabelo in vrstico. Pri konfliktih med posodobitvami je naveden tudi stolpec.
SQL Ustvarjanje
Parametrizirani stavki INSERT, UPDATE in DELETE z razvrščanjem, ki upošteva tuje ključe. Predogled izvajanja na suho ali uporaba v transakciji.
CLI
Ustvarjanje posnetkov, primerjava in združevanje iz ukazne vrstice. Podpira MySQL in SQLite prek spremenljivk okolja.
Preizkušeno
32 regresijskih scenarijev z ročno napisanimi pričakovanji (composer test:oracle). CI izvaja 231 enotne in integracijske preizkuse ter PHPStan na ravni 10.
Zakaj Merql
Posnetki so datoteke
Vsak posnetek je ena datoteka JSON, ki jo lahko kopirate med računalniki ali vključite v nadzor različic. Primerjava in združevanje bereta te datoteke, zato delujeta brez povezave z zbirko podatkov.
Preglejte pred zapisom
Načrt združevanja vsakemu ID-ju operacije in skupine sprememb zagotovi stabilen ID ter ohrani vrstice base, ours, theirs in result. Izberite želene skupine in uporabite samo njih.
Zastareli načrti se ustavijo
Zaščitena uporaba zapisuje samo v vrstice, ki se še vedno ujemajo s pregledanim posnetkom. Če stavek vpliva na nič vrstic, se transakcija povrne, rezultat pa vsebuje napako.
Povrnitev s preverjanjem odstopanj
Tik pred zapisom ustvarite načrt povrnitve iz živih vrstic in ga shranite kot JSON. Pred razveljavitvijo preverjanje odstopanj primerja prstne odtise vrstic in vrne operacije za vrstice, ki so se od takrat spremenile.
V primerjavi z
Merql združuje podatke vrstic iz treh posnetkov. Ta orodja različicijo, sinhronizirajo ali selijo zbirke podatkov; to so sorodna opravila.
| Orodje | Primerno za | Razlika v primerjavi z Merql |
|---|---|---|
| Dolt | Primerno zaDolt je zbirka podatkov SQL, ki jo lahko razvejite, klonirate, združujete, pošiljate in prenašate kot repozitorij Git. Povežete se z njo kot s katero koli zbirko podatkov MySQL, spremlja pa izvor vsake celice. | Razlika v primerjavi z MerqlMerql ohrani obstoječo zbirko podatkov MySQL ali SQLite. Tabele shrani kot datoteke posnetkov JSON in združi tri posnetke, pri čemer osnovni posnetek izberete sami. |
| pt-table-sync | Primerno zapt-table-sync poišče in odpravi razlike med tabelami MySQL enosmerno ali v obeh smereh med strežniki. Pri sinhronizaciji replike spremembe izvede na viru replikacije. | Razlika v primerjavi z MerqlPri dvosmerni sinhronizaciji pt-table-sync izbere zmagovalno vrstico na podlagi stolpca za konflikte in kopira njene vrednosti. Merql primerja obe strani s skupno osnovo, združuje spremembe različnih stolpcev iste vrstice in nezdružljive spremembe prijavi kot konflikte, ki jih razrešite sami. |
| sqldiff | Primerno zasqldiff primerja dve zbirki podatkov SQLite in izpiše skript SQL, ki prvo pretvori v drugo. Zapiše lahko tudi binarni nabor sprememb za razširitev seje SQLite ali povzame spremenjene vrstice po tabelah. | Razlika v primerjavi z MerqlDvosmerna primerjava ne more ugotoviti, ali je ena stran dodala vrstico ali jo je druga izbrisala. Merql doda osnovni posnetek, da to razjasni, združi dva nabora sprememb in deluje tudi z MySQL. |
| Doctrine Migrations | Primerno zaDoctrine Migrations upravlja različice sheme vaše zbirke podatkov, zato lahko spremembe sheme pregledate in preizkusite, preden jih uvedete v produkcijo. | Razlika v primerjavi z MerqlMerql ni orodje za selitev sheme. Združuje podatke vrstic in poroča o stolpcih, dodanih ali odstranjenih med posnetki, spremembe sheme pa prepušča vam. |
Vprašanja in odgovori
Kratki odgovori iz dokumentacije za Merql.
MySQL in SQLite prek adapterjev PDO ali mysqli. Za drug pogon napišite razred, ki implementira vmesnik Driver, in ga registrirajte z DriverFactory::register().
Ne. Ne seli shem, ne replicira zbirk podatkov in jih ne sinhronizira v realnem času. Iz treh stanj zbirke podatkov ustvari četrto, združeno stanje, in označi konflikte.
Ko obe strani spremenita isti stolpec iste vrstice na različni vrednosti, ko ena stran posodobi vrstico, ki jo je druga izbrisala, ali ko obe vstavita vrstico z enakim ključem. Spremembe različnih stolpcev iste vrstice se združijo brez težav.
Ne. Bereta shranjene datoteke posnetkov, zato sta s podatkovno zbirko povezana samo zajem posnetka in uporaba rezultata.
Da. Ustvarite načrt združevanja, izberite skupine sprememb po njihovih ID-jih in izbor pretvorite v čist rezultat za Merql::apply() ali Merql::applyGuarded().
Samo če to izrecno omogočite z ustvarjanjem ThreeWayMerge z nastavitvijo CellMergeConfig, kot je CellMergeConfig::auto(). Merql::merge(), Merql::plan() in CLI obravnavajo vsako vrednost stolpca kot celoto.
Sledite vodniku od prvega posnetka do načrtov združevanja, zaščitene uporabe in povrnitve.