Merql
Čisté trojstranné zlúčenie databáz v jazyku PHP s riešením konfliktov na úrovni stĺpcov. Sémantika zlúčenia v štýle Git pre tabuľky MySQL a SQLite.
composer require merql/merqlNajnovšie vydanie 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 praxi
Zlúčenie načíta tri uložené snímky a vráti operácie na zápis a konflikty, ktoré treba vyriešiť.
Zlúčiť tri snímky
Vytvorte snímku základnej verzie skôr, než sa obe kópie rozídu, a potom zaznamenajte každú stranu, napríklad živú databázu a sandboxovú kópiu. ThreeWayMerge porovná obe strany so základnou verziou a zlúči obe sady zmien.
Na karte výsledku naša strana upravila content a ich strana upravila title a status v tom istom riadku, takže zlúčenie zachová všetky tri úpravy bez konfliktu.
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" }Trojstranné zlúčenie
Základná verzia, naša strana, ich strana. Trojstranné zlúčenie v štýle git nad riadkami a stĺpcami s kľúčmi namiesto riadkov textu. Zisťuje vloženia, aktualizácie a odstránenia v dvoch vetvách.
Riešenie na úrovni stĺpcov
Keď obe strany zmenia ten istý riadok, merql porovnáva jednotlivé stĺpce. Konflikt vznikne iba vtedy, keď sa ten istý stĺpec zmení na odlišné hodnoty.
Voliteľné zlučovanie buniek
Odovzdajte CellMergeConfig do ThreeWayMerge a stĺpce TEXT sa zlúčia riadok po riadku pomocou rozdielového algoritmu Myers, stĺpce JSON kľúč po kľúči. Fasáda Merql ani CLI túto funkciu nepovoľujú.
Viacero databáz
Pripojiteľné adaptéry pripojenia a ovládače dialektov; MySQL a SQLite sú súčasťou balenia.
Zisťovanie konfliktov
Aktualizácia oproti aktualizácii, aktualizácia oproti odstráneniu, odstránenie oproti aktualizácii a vloženie oproti vloženiu; každý konflikt sa nahlási spolu s tabuľkou a riadkom. Pri konfliktoch medzi aktualizáciami sa uvedie aj stĺpec.
Generovanie SQL
Parametrizované príkazy INSERT, UPDATE a DELETE s poradím zohľadňujúcim FK. Náhľad nanečisto alebo použitie v transakcii.
CLI
Vytvárajte snímky, rozdiely a zlúčenia z príkazového riadka. Podporuje MySQL a SQLite prostredníctvom premenných prostredia.
Testované
32 regresných scenárov s ručne napísanými očakávanými výsledkami (composer test:oracle). CI spúšťa 231 jednotkové a integračné testy a PHPStan úrovne 10.
Prečo Merql
Snímky sú súbory
Každá snímka je jeden súbor JSON, ktorý môžete kopírovať medzi počítačmi alebo odovzdať do systému správy verzií. Porovnávanie a zlúčenie čítajú tieto súbory, takže fungujú bez pripojenia k databáze.
Pred zápisom všetko skontrolujte
Plán zlúčenia priradí každej operácii a skupine zmien stabilné ID a uchová riadky zo základnej verzie, našej strany, ich strany a výsledku. Vyberte požadované skupiny a použite iba ich.
Zastavenie zastaraných plánov
Riadené použitie zapisuje iba do riadkov, ktoré sa stále zhodujú so skontrolovanou snímkou. Ak príkaz ovplyvní nula riadkov, transakcia sa vráti späť a výsledok obsahuje chybu.
Vrátenie zmien s kontrolou odchýlok
Vytvorte plán na vrátenie zmien zo živých riadkov tesne pred zápisom a uložte ho ako JSON. Pred vrátením kontrola odchýlok porovná odtlačky riadkov a vráti operácie pre riadky, ktoré sa odvtedy zmenili.
V porovnaní s
Merql zlučuje údaje o riadkoch z troch snímok. Tieto nástroje vytvárajú verzie databáz, synchronizujú ich alebo migrujú – ide o príbuzné úlohy.
| Nástroj | V čom vyniká | Rozdiel oproti Merql |
|---|---|---|
| Dolt | V čom vynikáDolt je databáza SQL, ktorú možno rozdeliť, klonovať, vetviť, zlúčiť, odosielať a sťahovať ako repozitár Git. Pripojíte sa k nej ako ku každej databáze MySQL a sleduje pôvod každej bunky. | Rozdiel oproti MerqlMerql zachová databázu MySQL alebo SQLite, ktorú už používate. Ukladá tabuľky ako súbory snímok JSON a zlúči tri takéto súbory; základnú snímku vyberáte vy. |
| pt-table-sync | V čom vynikápt-table-sync vyhľadáva a opravuje rozdiely medzi tabuľkami MySQL jedným smerom alebo oboma smermi medzi servermi. Pri synchronizácii repliky vykonáva zmeny na zdroji replikácie. | Rozdiel oproti MerqlPri obojsmernej synchronizácii pt-table-sync vyberie víťazný riadok podľa stĺpca konfliktu a skopíruje jeho hodnoty. Merql porovnáva obe strany so spoločnou základnou verziou, zlučuje úpravy rôznych stĺpcov toho istého riadka a nekompatibilné zmeny hlási ako konflikty, ktoré treba vyriešiť. |
| sqldiff | V čom vynikásqldiff porovná dve databázy SQLite a vypíše skript SQL, ktorý prevedie prvú na druhú. Môže tiež zapísať binárnu sadu zmien pre rozšírenie relácie SQLite alebo zhrnúť zmenené riadky v jednotlivých tabuľkách. | Rozdiel oproti MerqlObojsmerné porovnanie nedokáže určiť, či jedna strana pridala riadok, alebo ho druhá odstránila. Merql pridáva základnú snímku, ktorá na to odpovie, zlúči dve sady zmien a funguje aj s MySQL. |
| Doctrine Migrations | V čom vynikáDoctrine Migrations spravuje verzie schémy databázy, takže zmeny schémy možno skontrolovať a otestovať pred nasadením do produkcie. | Rozdiel oproti MerqlMerql nie je nástroj na migráciu schémy. Zlučuje údaje o riadkoch a nahlasuje stĺpce pridané alebo odstránené medzi snímkami; zmenu schémy necháva na vás. |
Otázky a odpovede
Stručné odpovede z dokumentácie Merql.
MySQL a SQLite prostredníctvom adaptérov PDO alebo mysqli. Pre iný databázový systém napíšte triedu implementujúcu rozhranie Driver a zaregistrujte ju pomocou DriverFactory::register().
Nie. Nemigruje schémy, nereplikuje databázy ani ich nesynchronizuje v reálnom čase. Z troch stavov databázy vytvorí zlúčený štvrtý stav a označí konflikty.
Keď obe strany zmenia ten istý stĺpec toho istého riadka na odlišné hodnoty, keď jedna strana aktualizuje riadok, ktorý druhá odstránila, alebo keď obe vložia riadok s rovnakým kľúčom. Úpravy rôznych stĺpcov toho istého riadka sa zlúčia bez konfliktu.
Nie. Čítajú uložené súbory snímok, takže k databáze sa pripája iba vytvorenie snímky a použitie výsledku.
Vytvorte plán zlúčenia, vyberte skupiny zmien podľa ich ID a premeňte výber na čistý výsledok pre Merql::apply() alebo Merql::applyGuarded().
Iba ak to povolíte vytvorením ThreeWayMerge s konfiguráciou CellMergeConfig, napríklad CellMergeConfig::auto(). Merql::merge(), Merql::plan() a CLI považujú každú hodnotu stĺpca za celok.
Postupujte podľa príručky od prvej snímky cez plány zlúčenia až po bezpečné použitie a vrátenie zmien.