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 порівнює обидві сторони з базою та об’єднує два набори змін.
На вкладці результату наша сторона змінила content, а їхня — 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 та рівень 10 PHPStan.
Чому Merql
Знімки — це файли
Кожен знімок — це один файл JSON, який можна копіювати між комп’ютерами або додавати до системи керування версіями. Порівняння та злиття читають ці файли, тому можуть працювати без підключення до бази даних.
Перевірте перед записом
План злиття надає кожній операції та групі змін стабільний ID і зберігає рядки бази, нашої сторони, їхньої сторони та результату. Виберіть потрібні групи й застосуйте лише їх.
Застарілі плани зупиняють
Захищене застосування записує дані лише в рядки, які досі відповідають перевіреному вами знімку. Якщо оператор зачіпає нуль рядків, транзакція відкочується, а результат містить помилку.
Відкат із перевіркою розбіжностей
Створіть план відкату на основі актуальних рядків безпосередньо перед записом і збережіть його як 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().
Ні. Він не переносить схеми, не реплікує бази даних і не синхронізує їх у реальному часі. На основі трьох станів бази даних він створює об’єднаний четвертий стан із позначеними конфліктами.
Коли обидві сторони змінюють той самий стовпець того самого рядка на різні значення, коли одна сторона оновлює рядок, видалений іншою, або коли обидві вставляють рядок із тим самим ключем. Зміни в різних стовпцях одного рядка об’єднуються без конфлікту.
Ні. Вони читають збережені файли знімків, тому підключення до бази даних потрібне лише для створення знімка та застосування результату.
Так. Створіть план об’єднання, виберіть групи змін за їхніми ідентифікаторами й перетворіть вибране на чистий результат для Merql::apply() або Merql::applyGuarded().
Лише якщо ви ввімкнете це, створивши ThreeWayMerge із CellMergeConfig, наприклад CellMergeConfig::auto(). Merql::merge(), Merql::plan() і CLI розглядають значення кожного стовпця як єдине ціле.
Пройдіть посібник від першого знімка до планів об’єднання, захищеного застосування та відкату.