Към съдържанието

Merql

Трипосочно сливане на бази данни с PHP и разрешаване на конфликти на ниво колона. Семантика на сливане по подобие на Git за таблици в MySQL и SQLite.

Терминал
composer require merql/merql

Последна версия v0.4.1 MIT PHP 8.2+

На практика

Сливането чете три запазени моментни снимки и връща операциите за запис и конфликтите за разрешаване.

Слейте три моментни снимки

Направете базовата моментна снимка, преди двете копия да се разделят, а след това заснемете всяка страна, например активната база данни и копие в изолирана среда. ThreeWayMerge сравнява двете страни с базата и слива двата набора от промени.

В раздела с резултата ours редактира content, а theirs редактира title и status от същия ред, така че сливането запазва и трите редакции без конфликт.

PHP
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

echo $result->operationCount(); // resolved operations
echo $result->conflictCount();  // unresolved conflicts

Трипосочно сливане

Основно състояние, нашето, тяхното. Тристранно обединяване в стил 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.

Следвайте ръководството от първата моментна снимка до плановете за сливане, защитеното прилагане и връщането назад.