Merql
Čisté třícestné sloučení databází v PHP s řešením konfliktů na úrovni sloupců. Sémantika sloučení ve stylu Git aplikovaná na tabulky MySQL a SQLite.
composer require merql/merqlNejnovější vydání 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
Sloučení načte tři uložené snímky a vrátí operace k zápisu i konflikty k vyřešení.
Sloučte tři snímky
Pořiďte snímek základu před rozdělením obou kopií, pak vytvořte snímek každé strany, například živé databáze a její kopie v sandboxu. ThreeWayMerge porovná obě strany se základem a sloučí jejich sady změn.
Na kartě výsledku naše strana upravila content a jejich strana upravila title a status téhož řádku, takže sloučení zachová všechny tři ú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" }Třícestné sloučení
Základní verze, naše, jejich. Třícestné slučování ve stylu git nad klíčovanými řádky a sloupci místo řádků textu. Zjišťuje vložení, aktualizace a odstranění napříč dvěma větvemi.
Řešení na úrovni sloupců
Když obě strany změní stejný řádek, merql porovná jednotlivé sloupce. Konflikt nastane jen tehdy, když se stejný sloupec změní na různé hodnoty.
Volitelné sloučení buněk
Předejte ThreeWayMerge konfiguraci CellMergeConfig a sloupce TEXT se sloučí po řádcích pomocí Myersova diffu, sloupce JSON podle klíčů. Fasáda Merql ani CLI tuto funkci nezapínají.
Více databází
Vyměnitelné adaptéry připojení a ovladače dialektů, s vestavěnou podporou MySQL a SQLite.
Detekce konfliktů
Aktualizace proti aktualizaci, aktualizace proti odstranění, odstranění proti aktualizaci a vložení proti vložení; každý konflikt je uveden spolu s tabulkou a řádkem. U konfliktů mezi aktualizacemi je uveden i sloupec.
Generování SQL
Parametrizované příkazy INSERT, UPDATE a DELETE s pořadím zohledňujícím cizí klíče. Náhled nanečisto nebo použití v transakci.
CLI
Pořizujte snímky, porovnávejte je a slučujte z příkazového řádku. Podporuje MySQL a SQLite prostřednictvím proměnných prostředí.
Otestováno
32 regresních scénářů s ručně napsanými očekávanými výsledky (composer test:oracle). CI spouští 231 jednotkové a integrační testy a PHPStan na úrovni 10.
Proč Merql
Snímky jsou soubory
Každý snímek je soubor JSON, který můžete kopírovat mezi počítači nebo uložit do správy verzí. Porovnání i sloučení čtou tyto soubory, takže nevyžadují připojení k databázi.
Než začnete zapisovat, vše zkontrolujte
Plán sloučení přidělí každé operaci a skupině změn stabilní ID a uchová řádky základu, naší strany, jejich strany i výsledku. Vyberte požadované skupiny a použijte jen ty.
Zastaralé plány se zastaví
Chráněné použití zapisuje pouze do řádků, které stále odpovídají zkontrolovanému snímku. Pokud příkaz ovlivní nula řádků, transakce se vrátí zpět a výsledek obsahuje chybu.
Vrácení změn s kontrolou odchylek
Vytvořte plán vrácení změn z živých řádků těsně před zápisem a uložte jej jako JSON. Před vrácením změn kontrola odchylek porovná otisky řádků a vrátí operace pro řádky, které se od té doby změnily.
Srovnání
Merql slučuje data řádků ze tří snímků. Tyto nástroje verzují, synchronizují nebo migrují databáze, což jsou související úlohy.
| Nástroj | Vhodné pro | Rozdíl oproti Merql |
|---|---|---|
| Dolt | Vhodné proDolt je databáze SQL, kterou můžete rozvětvovat, klonovat, vytvářet v ní větve, slučovat je, odesílat a stahovat změny jako v repozitáři Git. Připojujete se k ní jako k jakékoli databázi MySQL a sleduje původ každé buňky. | Rozdíl oproti MerqlMerql zachovává databázi MySQL nebo SQLite, kterou už používáte. Ukládá tabulky do souborů snímků JSON a slučuje tři z nich; základní snímek vybíráte vy. |
| pt-table-sync | Vhodné propt-table-sync vyhledává a opravuje rozdíly mezi tabulkami MySQL jedním směrem nebo oběma směry mezi servery. Při synchronizaci repliky provádí změny na zdroji replikace. | Rozdíl oproti MerqlPři obousměrné synchronizaci pt-table-sync vybere vítězný řádek podle konfliktního sloupce a zkopíruje jeho hodnoty. Merql porovnává obě strany se společným základem, slučuje úpravy různých sloupců téhož řádku a neslučitelné změny hlásí jako konflikty k vyřešení. |
| sqldiff | Vhodné prosqldiff porovnává dvě databáze SQLite a vypíše skript SQL, který převede první na druhou. Může také zapsat binární sadu změn pro rozšíření relace SQLite nebo shrnout změněné řádky podle tabulek. | Rozdíl oproti MerqlObousměrný rozdíl neukáže, zda jedna strana přidala řádek, nebo jej druhá odstranila. Merql k tomu přidává základní snímek, slučuje dvě sady změn a funguje také s MySQL. |
| Doctrine Migrations | Vhodné proDoctrine Migrations verzují schéma databáze, takže změny schématu lze zkontrolovat a otestovat před nasazením do produkčního prostředí. | Rozdíl oproti MerqlMerql není nástroj pro migraci schématu. Slučuje data řádků a hlásí sloupce přidané nebo odebrané mezi snímky; změnu schématu ponechává na vás. |
Zdroje, zaškrtnuto
Otázky a odpovědi
Stručné odpovědi z dokumentace Merql.
MySQL a SQLite prostřednictvím adaptérů PDO nebo mysqli. Pro jiný databázový stroj napište třídu implementující rozhraní Driver a zaregistrujte ji pomocí DriverFactory::register().
Ne. Nemigruje schémata, nereplikuje databáze ani je nesynchronizuje v reálném čase. Ze tří stavů databáze vytvoří sloučený čtvrtý stav a označí konflikty.
Když obě strany změní stejný sloupec téhož řádku na různé hodnoty, když jedna strana řádek aktualizuje a druhá odstraní, nebo když obě vloží řádek se stejným klíčem. Úpravy různých sloupců jednoho řádku se sloučí bez problémů.
Ne. Čtou uložené soubory snímků, takže připojení k databázi je potřeba pouze při pořizování snímku a použití výsledku.
Ano. Vytvořte plán sloučení, vyberte skupiny změn podle jejich ID a převeďte výběr na čistý výsledek pro Merql::apply() nebo Merql::applyGuarded().
Pouze pokud tuto možnost zapnete vytvořením ThreeWayMerge s konfigurací CellMergeConfig, například CellMergeConfig::auto(). Merql::merge(), Merql::plan() a CLI považují každou hodnotu sloupce za celek.
Postupujte podle průvodce od prvního snímku přes plány sloučení a chráněné použití až po vrácení změn.