Przejdź do treści

Merql

Czysta biblioteka PHP do trójstronnego scalania baz danych z rozwiązywaniem konfliktów na poziomie kolumn. Semantyka scalania w stylu Git dla tabel MySQL i SQLite.

Terminal
composer require merql/merql

Najnowsze wydanie v0.4.1 MIT PHP 8.2+

W praktyce

Scalanie odczytuje trzy zapisane migawki i zwraca operacje do zapisania oraz konflikty do rozwiązania.

Scal trzy migawki

Utwórz migawkę bazową, zanim obie kopie się rozgałęzią, a następnie utwórz migawkę każdej strony, na przykład bazy produkcyjnej i jej kopii w piaskownicy. ThreeWayMerge porównuje obie strony z bazą i scala oba zestawy zmian.

Na karcie wyniku widać, że nasze zmiany dotyczą content, a ich zmiany dotyczą title i status tego samego wiersza, więc scalanie zachowuje wszystkie trzy zmiany bez konfliktu.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Scalanie trójstronne

Stan bazowy, nasza wersja, ich wersja. Trójstronne scalanie w stylu git, operujące na wierszach identyfikowanych kluczami i ich kolumnach zamiast na liniach tekstu. Wykrywa wstawienia, aktualizacje i usunięcia w dwóch gałęziach.

Rozwiązywanie na poziomie kolumn

Gdy obie strony zmieniają ten sam wiersz, merql porównuje kolumny osobno. Konflikt występuje tylko wtedy, gdy ta sama kolumna otrzyma różne wartości.

Scalanie komórek na żądanie

Przekaż CellMergeConfig do ThreeWayMerge, a kolumny TEXT będą scalane linia po linii za pomocą różnicowania Myersa, zaś kolumny JSON — klucz po kluczu. Fasada Merql ani CLI nie włączają tej funkcji.

Wiele baz danych

Wymienne adaptery połączeń i sterowniki dialektów, z wbudowaną obsługą MySQL i SQLite.

Wykrywanie konfliktów

Aktualizacja względem aktualizacji, aktualizacja względem usunięcia, usunięcie względem aktualizacji oraz wstawienie względem wstawienia — każdy przypadek jest zgłaszany wraz z tabelą i wierszem. Konflikty aktualizacji wskazują też kolumnę.

Generowanie SQL

Parametryzowane instrukcje INSERT, UPDATE i DELETE z kolejnością uwzględniającą klucze obce. Podgląd bez zmian lub zastosowanie w transakcji.

CLI

Twórz migawki, porównuj i scalaj z wiersza poleceń. Obsługuje MySQL i SQLite za pomocą zmiennych środowiskowych.

Przetestowane

32 scenariusze regresji z ręcznie zapisanymi oczekiwaniami (composer test:oracle). CI uruchamia testy jednostkowe i integracyjne 231 oraz poziom 10 PHPStan.

Dlaczego Merql

Migawki są plikami

Każda migawka to jeden plik JSON, który można kopiować między komputerami lub zatwierdzić w systemie kontroli wersji. Porównywanie i scalanie odczytują te pliki, więc nie wymagają połączenia z bazą danych.

Sprawdź przed zapisem

Plan scalania przypisuje każdej operacji i grupie zmian stały identyfikator oraz zachowuje wiersze bazowe, nasze, ich i wynikowe. Wybierz potrzebne grupy i zastosuj tylko je.

Nieaktualne plany są zatrzymywane

Zastosowanie z ochroną zapisuje wyłącznie wiersze, które nadal odpowiadają sprawdzonej migawce. Jeśli instrukcja nie zmieni żadnego wiersza, transakcja jest wycofywana, a wynik zawiera błąd.

Wycofanie ze sprawdzeniem rozbieżności

Utwórz plan wycofania na podstawie bieżących wierszy tuż przed zapisem i zachowaj go jako JSON. Przed cofnięciem sprawdzenie rozbieżności porównuje odciski wierszy i zwraca operacje dotyczące wierszy, które od tego czasu uległy zmianie.

W porównaniu z

Merql scala dane wierszy z trzech migawek. Te narzędzia wersjonują, synchronizują lub migrują bazy danych — zajmują się pokrewnymi zadaniami.

Merql w porównaniu z innymi narzędziami
Dolt Dobre wDolt to baza danych SQL, którą można rozgałęziać, klonować, scalać oraz wysyłać i pobierać zmiany, tak jak w repozytorium Git. Łączysz się z nią jak z dowolną bazą danych MySQL, a ona śledzi pochodzenie każdej komórki. Różnica w porównaniu z MerqlMerql zachowuje używaną już bazę danych MySQL lub SQLite. Zapisuje tabele jako pliki migawek JSON i scala trzy takie pliki, przy czym samodzielnie wybierasz migawkę bazową.
pt-table-sync Dobre wpt-table-sync wyszukuje różnice między tabelami MySQL i je usuwa, w jednym kierunku lub w obu kierunkach między serwerami. Podczas synchronizacji repliki wprowadza zmiany w źródle replikacji. Różnica w porównaniu z MerqlPodczas synchronizacji dwukierunkowej pt-table-sync wybiera zwycięski wiersz na podstawie kolumny konfliktu i kopiuje jego wartości. Merql porównuje obie strony ze wspólną bazą, scala zmiany w różnych kolumnach tego samego wiersza i zgłasza niezgodne zmiany jako konflikty do rozwiązania.
sqldiff Dobre wsqldiff porównuje dwie bazy danych SQLite i wyświetla skrypt SQL, który przekształca pierwszą w drugą. Może też zapisać binarny zestaw zmian dla rozszerzenia sesji SQLite lub podsumować zmienione wiersze w poszczególnych tabelach. Różnica w porównaniu z MerqlPorównanie dwukierunkowe nie pozwala ustalić, czy jedna strona dodała wiersz, czy druga go usunęła. Merql dodaje migawkę bazową, aby to rozstrzygnąć, scala dwa zestawy zmian i działa również z MySQL.
Doctrine Migrations Dobre wDoctrine Migrations wersjonuje schemat bazy danych, dzięki czemu zmiany schematu można sprawdzić i przetestować przed wdrożeniem na produkcji. Różnica w porównaniu z MerqlMerql nie jest narzędziem do migracji schematu. Scala dane wierszy i zgłasza kolumny dodane lub usunięte między migawkami, pozostawiając zmianę schematu użytkownikowi.

Pytania i odpowiedzi

Krótkie odpowiedzi z dokumentacji Merql.

Przejdź przez przewodnik od pierwszej migawki po plany scalania, zastosowanie z ochroną i wycofanie.