Merql
Трипосочно сливане на бази данни с PHP и разрешаване на конфликти на ниво колона. Семантика на сливане по подобие на Git за таблици в MySQL и SQLite.
composer require merql/merqlПоследна версия 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']);На практика
Сливането чете три запазени моментни снимки и връща операциите за запис и конфликтите за разрешаване.
Слейте три моментни снимки
Направете базовата моментна снимка, преди двете копия да се разделят, а след това заснемете всяка страна, например активната база данни и копие в изолирана среда. ThreeWayMerge сравнява двете страни с базата и слива двата набора от промени.
В раздела с резултата ours редактира content, а theirs редактира title и status от същия ред, така че сливането запазва и трите редакции без конфликт.
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" }Трипосочно сливане
Основно състояние, нашето, тяхното. Тристранно обединяване в стил git на редове и колони с ключове вместо на редове текст. Открива вмъквания, актуализации и изтривания между два клона.
Разрешаване на ниво колона
Когато и двете страни променят един и същ ред, merql сравнява колоните поотделно. Отчита конфликт само когато една и съща колона е променена с различни стойности.
Сливане на клетки по избор
Подайте CellMergeConfig на ThreeWayMerge и колоните TEXT ще се сливат ред по ред с Myers diff, а колоните JSON — ключ по ключ. Фасадата Merql и CLI не го активират.
Няколко бази данни
Свързващи адаптери и драйвери за диалекти, които могат да се включват, с вградени MySQL и SQLite.
Откриване на конфликти
Актуализация срещу актуализация, актуализация срещу изтриване, изтриване срещу актуализация и вмъкване срещу вмъкване — всеки случай се отчита с таблицата и реда. При конфликти между актуализации се посочва и колоната.
SQL Генериране
Параметризирани заявки INSERT, UPDATE, DELETE с подредба, съобразена с външните ключове. Преглед в пробен режим или прилагане в транзакция.
CLI
Създаване на моментни снимки, сравнение и сливане от командния ред. Поддържа MySQL и SQLite чрез променливи на средата.
Тествано
32 регресионни сценария с написани на ръка очаквания (composer test:oracle). CI изпълнява 231 модулни и интеграционни тестове и PHPStan на ниво 10.
Защо Merql
Моментните снимки са файлове
Всяка моментна снимка е един файл JSON, който можете да копирате между машини или да добавите към системата за контрол на версиите. Сравняването и сливането четат тези файлове и затова работят без връзка с база данни.
Преглед преди запис
Планът за сливане задава на всяка операция и група промени стабилно ID и запазва редовете base, ours, theirs и result. Изберете желаните групи и приложете само тях.
Остарелите планове се спират
Защитеното прилагане записва само в редове, които все още съответстват на моментната снимка, която сте прегледали. Ако заявка не засегне нито един ред, транзакцията се отменя и резултатът съдържа грешката.
Връщане назад с проверка за отклонения
Създайте план за връщане назад от активните редове непосредствено преди записването и го съхранете като JSON. Преди отмяната проверката за отклонения сравнява отпечатъците на редовете и връща операциите, чиито редове са се променили оттогава.
Сравнение с
Merql слива данни за редове от три моментни снимки. Тези инструменти управляват версиите, синхронизират или мигрират бази данни — сродни задачи.
| Инструмент | Подходящ за | Разлики спрямо Merql |
|---|---|---|
| Dolt | Подходящ заDolt е база данни SQL, която можете да разклонявате, клонирате, сливате, изпращате и изтегляте подобно на хранилище Git. Свързвате се с нея като с всяка база данни MySQL, а тя проследява историята на всяка клетка. | Разлики спрямо MerqlMerql запазва базата данни MySQL или SQLite, която вече използвате. Записва таблиците във файлове с моментни снимки JSON и слива три от тях, като вие избирате базовата снимка. |
| pt-table-sync | Подходящ заpt-table-sync открива и поправя разлики между таблици MySQL еднопосочно или в двете посоки между сървъри. При синхронизиране на реплика той извършва промените в източника на репликацията. | Разлики спрямо MerqlПри двупосочна синхронизация pt-table-sync избира печеливш ред според колона за конфликти и копира стойностите му. Merql сравнява двете страни спрямо обща база, слива редакции в различни колони на един и същ ред и отчита несъвместимите промени като конфликти за разрешаване. |
| sqldiff | Подходящ заsqldiff сравнява две бази данни SQLite и отпечатва скрипт SQL, който превръща първата във втората. Може също да запише двоичен набор от промени за разширението на сесии SQLite или да обобщи променените редове по таблици. | Разлики спрямо MerqlДвустранното сравнение не може да определи дали едната страна е добавила ред, или другата го е изтрила. Merql добавя базова моментна снимка, за да отговори на този въпрос, слива два набора от промени и работи и с MySQL. |
| Doctrine Migrations | Подходящ заDoctrine Migrations управлява версиите на схемата на базата ви данни, така че промените в схемата да могат да бъдат прегледани и тествани преди внедряване в продукционна среда. | Разлики спрямо MerqlMerql не е инструмент за миграция на схеми. Той слива данните в редовете и отчита добавените или премахнатите между моментните снимки колони, като оставя промяната в схемата на вас. |
Източници, отметнато
Въпроси и отговори
Кратки отговори от документацията на Merql.
MySQL и SQLite чрез PDO или mysqli адаптерите. За друга машина за бази данни създайте клас, който реализира интерфейса Driver, и го регистрирайте чрез DriverFactory::register().
Не. Той не мигрира схеми, не репликира бази данни и не ги синхронизира в реално време. При три състояния на базата данни създава четвърто, обединено състояние, като посочва конфликтите.
Когато и двете страни променят една и съща колона на един и същ ред с различни стойности, когато едната страна актуализира ред, изтрит от другата, или когато и двете вмъкнат ред със същия ключ. Редакциите в различни колони на един ред се сливат без конфликт.
Не. Те четат запазени файлове с моментни снимки, затова само създаването на моментна снимка и прилагането на резултат се свързват с базата данни.
Да. Създайте план за сливане, изберете групите промени чрез техните ID и превърнете избора в изчистен резултат за Merql::apply() или Merql::applyGuarded().
Само ако изрично го активирате, като създадете ThreeWayMerge с CellMergeConfig, например CellMergeConfig::auto(). Merql::merge(), Merql::plan() и CLI третират стойността на всяка колона като цяло.
Следвайте ръководството от първата моментна снимка до плановете за сливане, защитеното прилагане и връщането назад.