Merql
Tiszta PHP háromutas adatbázis-egyesítés oszlopszintű konfliktusfeloldással. Git stílusú egyesítési szemantika MySQL és SQLite táblákhoz.
composer require merql/merqlLegújabb kiadás 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']);A gyakorlatban
Az egyesítés három mentett pillanatképből beolvassa az írandó műveleteket és a feloldandó konfliktusokat.
Három pillanatkép egyesítése
Készítsd el az alap pillanatképét, mielőtt a két másolat szétválik, majd mindkét oldalról készíts pillanatképet, például az éles adatbázisról és egy sandbox-másolatról. A ThreeWayMerge mindkét oldalt az alaphoz hasonlítja, majd egyesíti a két változáskészletet.
Az eredménylapon a miénk a content, az övék pedig ugyanannak a sornak a title és status értékét szerkesztette, ezért az egyesítés mindhárom módosítást megtartja konfliktus nélkül.
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" }Háromutas egyesítés
Alap, miénk, övék. A githez hasonló háromutas egyesítés kulccsal azonosított adatbázissorokon és oszlopokon, szövegsorok helyett. Két ág beszúrásait, frissítéseit és törléseit is felismeri.
Oszlopszintű feloldás
Ha mindkét oldal módosítja ugyanazt a sort, a merql oszloponként hasonlítja össze az értékeket. Csak akkor jelez konfliktust, ha ugyanaz az oszlop eltérő értékre változik.
Választható cellaszintű egyesítés
Adj át egy CellMergeConfig példányt a ThreeWayMerge-nek: ekkor a TEXT oszlopokat soronkénti Myers diff segítségével egyesíti, a JSON oszlopokat pedig kulcsonként. A Merql facade és a CLI nem engedélyezi ezt.
Több adatbázis
Bővíthető kapcsolati adapterek és dialektusillesztők, beépített MySQL és SQLite támogatással.
Konfliktusészlelés
Frissítés frissítéssel, frissítés törléssel, törlés frissítéssel, beszúrás beszúrással ütközése: mindegyik tábla és sor szerint jelentve. A frissítés-frissítés konfliktusok az érintett oszlopot is megnevezik.
SQL-generálás
Paraméterezett INSERT, UPDATE és DELETE utasítások, idegen kulcsokat figyelembe vevő sorrenddel. Száraz futtatásos előnézet vagy alkalmazás tranzakcióban.
CLI
Pillanatkép készítése, diff és egyesítés a parancssorból. A MySQL és a SQLite támogatott környezeti változókon keresztül.
Tesztelt
32 regressziós forgatókönyv kézzel írt elvárásokkal (composer test:oracle). A CI 231 egység- és integrációs teszteket, valamint PHPStan 10-es szintet futtat.
Miért Merql?
A pillanatképek fájlok
Minden pillanatkép egyetlen JSON fájl, amelyet átmásolhatsz más gépekre, vagy beküldhetsz verziókezelésbe. A diff és az egyesítés ezekből a fájlokból olvas, ezért adatbázis-kapcsolat nélkül is futnak.
Ellenőrzés írás előtt
Az egyesítési terv minden művelethez és változáscsoporthoz stabil azonosítót rendel, és megőrzi az alap, a miénk, az övék és az eredmény sorait. Válaszd ki a kívánt csoportokat, és csak azokat alkalmazd.
Az elavult tervek leállnak
A védett alkalmazás csak olyan sorokba ír, amelyek még mindig megfelelnek az ellenőrzött pillanatképnek. Ha egy utasítás nulla sort érint, a tranzakció visszagördül, az eredmény pedig tartalmazza a hibát.
Visszagörgetés eltérésellenőrzéssel
Közvetlenül az írás előtt készíts visszagörgetési tervet az éles sorokból, és mentsd el JSON formátumban. A visszavonás előtt az eltérésellenőrzés összehasonlítja a sorok ujjlenyomatait, és megadja azoknak a műveleteknek a listáját, amelyek sorai azóta megváltoztak.
Összehasonlítás
A Merql három pillanatkép soradatait egyesíti. Ezek az eszközök adatbázisok verziózását, szinkronizálását vagy migrálását végzik, vagyis kapcsolódó feladatokra valók.
| Eszköz | Amiben jó | Különbségek Merql-hoz képest |
|---|---|---|
| Dolt | Amiben jóA Dolt egy SQL adatbázis, amelyet a Git tárolóhoz hasonlóan elágaztathatsz, klónozhatsz, egyesíthetsz, feltölthetsz és letölthetsz. Mint bármely MySQL adatbázishoz, ehhez is csatlakozol; emellett nyomon követi minden cella eredetét. | Különbségek Merql-hoz képestA Merql megőrzi a már használt MySQL vagy SQLite adatbázist. A táblákat JSON pillanatképfájlokként menti, és hármat egyesít közülük, az alap pillanatképét pedig te választod ki. |
| pt-table-sync | Amiben jóA pt-table-sync megkeresi és kijavítja az eltéréseket a MySQL táblák között, egy irányban vagy két szerver között mindkét irányban. Replika szinkronizálásakor a változtatásokat a replikációs forráson hajtja végre. | Különbségek Merql-hoz képestKétirányú szinkronizáláskor a pt-table-sync egy konfliktusoszlop alapján kiválasztja a nyertes sort, majd átmásolja az értékeit. A Merql mindkét oldalt egy közös alaphoz hasonlítja, egyesíti ugyanazon sor különböző oszlopainak módosításait, az össze nem egyeztethető változásokat pedig feloldandó konfliktusként jelenti. |
| sqldiff | Amiben jóAz sqldiff két SQLite adatbázist hasonlít össze, és olyan SQL szkriptet ír ki, amely az elsőt a másodikká alakítja. Bináris változáskészletet is írhat a SQLite munkamenet-bővítményhez, vagy táblánként összefoglalhatja a módosult sorokat. | Különbségek Merql-hoz képestA kétutas diff nem tudja megállapítani, hogy az egyik oldal adott-e hozzá egy sort, vagy a másik törölte. A Merql egy alap-pillantképpel válaszol erre, egyesíti a két változáskészletet, és MySQL adatbázisokkal is működik. |
| Doctrine Migrations | Amiben jóA Doctrine Migrations verziózza az adatbázis sémáját, így a sémamódosításokat éles üzembe helyezés előtt ellenőrizheted és tesztelheted. | Különbségek Merql-hoz képestA Merql nem séma-migrációs eszköz. Soradatokat egyesít, és jelenti a pillanatképek között hozzáadott vagy eltávolított oszlopokat; a séma módosítása rád marad. |
Kérdések és válaszok
Rövid válaszok a Merql dokumentációjából.
MySQL és SQLite, a PDO vagy a mysqli adaptereken keresztül. Más adatbázismotorhoz írj egy, a Driver interfészt megvalósító osztályt, és regisztráld a DriverFactory::register() segítségével.
Nem. Nem migrál sémákat, nem replikál adatbázisokat, és nem szinkronizálja őket valós időben. Három adatbázisállapotból egy egyesített negyedik állapotot hoz létre, azonosítva a konfliktusokat.
Ha mindkét oldal ugyanannak a sornak ugyanazt az oszlopát eltérő értékre módosítja, ha az egyik oldal frissít egy sort, amelyet a másik törölt, vagy ha mindkét oldal azonos kulccsal szúr be egy sort. Egy sor különböző oszlopainak módosításai konfliktus nélkül egyesülnek.
Nem. Mentett pillanatképfájlokat olvasnak, így csak a pillanatkép készítéséhez és az eredmény alkalmazásához kell adatbázis-kapcsolat.
Igen. Készíts egyesítési tervet, válaszd ki a változáscsoportokat az azonosítóik alapján, majd alakítsd a kiválasztást tiszta eredménnyé a Merql::apply() vagy a Merql::applyGuarded() számára.
Csak akkor, ha ezt külön kéred a ThreeWayMerge egy CellMergeConfig példánnyal történő létrehozásakor, például CellMergeConfig::auto() használatával. A Merql::merge(), a Merql::plan() és a CLI minden oszlopértéket egészként kezel.
Kövesd az útmutatót az első pillanatképtől az egyesítési terveken és a védett alkalmazáson át a visszagörgetésig.