Merql
Îmbinare pură de baze de date în trei căi cu PHP și rezolvare a conflictelor la nivel de coloană. Semantică de îmbinare în stilul Git, aplicată tabelelor MySQL și SQLite.
composer require merql/merqlCea mai recentă versiune 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']);În practică
O îmbinare citește trei instantanee salvate și returnează operațiile de scris și conflictele de rezolvat.
Îmbinați trei instantanee
Creați instantaneul de bază înainte ca cele două copii să se separe, apoi creați câte un instantaneu pentru fiecare parte, de exemplu pentru o bază de date live și o copie sandbox. ThreeWayMerge compară ambele părți cu baza și îmbină cele două seturi de modificări.
În fila rezultatului, varianta noastră a editat content, iar varianta lor a editat title și status din același rând, astfel încât îmbinarea păstrează toate cele trei editări fără conflict.
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" }Îmbinare în trei direcții
Bază, varianta noastră, varianta lor. Îmbinare în trei căi în stilul git, pentru rânduri și coloane cu chei, în loc de linii. Detectează inserările, actualizările și ștergerile dintre două ramuri.
Rezolvare la nivel de coloană
Când ambele părți modifică același rând, merql compară fiecare coloană separat. Apar conflicte doar când aceeași coloană primește valori diferite.
Îmbinare opțională la nivel de celulă
Transmiteți un CellMergeConfig către ThreeWayMerge, iar coloanele TEXT se îmbină linie cu linie folosind Myers diff, iar coloanele JSON se îmbină cheie cu cheie. Facade-ul Merql și CLI nu activează această opțiune.
Mai multe baze de date
Adaptoare de conexiune și drivere de dialect interschimbabile, cu MySQL și SQLite incluse.
Detectarea conflictelor
Actualizare față de actualizare, actualizare față de ștergere, ștergere față de actualizare și inserare față de inserare: fiecare este raportată împreună cu tabelul și rândul. Conflictele dintre actualizări indică și coloana.
Cum generează merql SQL parametrizat din rezultatele îmbinărilor, cu ordonare după chei străine și gestionarea valorilor NULL.
Instrucțiuni INSERT, UPDATE și DELETE parametrizate, cu ordonare care ține cont de FK. Previzualizare fără modificări sau aplicare într-o tranzacție.
CLI
Creați instantanee, comparați-le și îmbinați-le din linia de comandă. Acceptă MySQL și SQLite prin variabile de mediu.
Testat
32 de scenarii de regresie cu rezultate așteptate scrise manual (composer test:oracle). CI rulează teste unitare și de integrare 231 și PHPStan nivelul 10.
De ce Merql
Instantaneele sunt fișiere
Fiecare instantaneu este un fișier JSON pe care îl puteți copia între mașini sau comite în controlul versiunilor. Compararea și îmbinarea citesc aceste fișiere, așa că rulează fără conexiune la baza de date.
Revizuiți înainte de a scrie
Un plan de îmbinare atribuie un ID stabil fiecărei operații și fiecărui grup de modificări și păstrează rândurile de bază, ale noastre, ale lor și rezultatul. Selectați grupurile dorite și aplicați-le doar pe acelea.
Planurile învechite se opresc
Aplicarea protejată scrie doar în rândurile care corespund în continuare instantaneului revizuit. Dacă o instrucțiune nu afectează niciun rând, tranzacția este anulată, iar rezultatul conține eroarea.
Anulare cu verificarea modificărilor
Construiți un plan de anulare din rândurile live chiar înainte de scriere și salvați-l ca JSON. Înainte de anulare, verificarea modificărilor compară amprentele rândurilor și returnează operațiile ale căror rânduri s-au schimbat între timp.
Comparativ cu
Merql îmbină datele rândurilor din trei instantanee. Aceste instrumente gestionează versiunile, sincronizează sau migrează bazele de date, activități conexe.
| Instrument | Potrivit pentru | Diferența față de Merql |
|---|---|---|
| Dolt | Potrivit pentruDolt este o bază de date SQL pe care o puteți bifurca, clona, ramifica, îmbina, trimite și prelua, la fel ca un depozit Git. Vă conectați la ea ca la orice bază de date MySQL, iar aceasta urmărește proveniența fiecărei celule. | Diferența față de MerqlMerql păstrează baza de date MySQL sau SQLite pe care o utilizați deja. Salvează tabelele în fișiere de instantanee JSON și îmbină trei dintre ele, cu instantaneul de bază ales de dumneavoastră. |
| pt-table-sync | Potrivit pentrupt-table-sync găsește și remediază diferențele dintre tabelele MySQL, într-un singur sens sau în ambele sensuri între servere. Când sincronizează o replică, efectuează modificările pe sursa replicării. | Diferența față de MerqlÎntr-o sincronizare bidirecțională, pt-table-sync alege rândul câștigător pe baza unei coloane de conflict și îi copiază valorile. Merql compară ambele părți cu o bază comună, îmbină editările din coloane diferite ale aceluiași rând și raportează modificările incompatibile drept conflicte pe care să le rezolvați. |
| sqldiff | Potrivit pentrusqldiff compară două baze de date SQLite și afișează un script SQL care transformă prima în a doua. Poate scrie și un set binar de modificări pentru extensia de sesiune SQLite sau poate rezuma rândurile modificate pentru fiecare tabel. | Diferența față de MerqlO comparație în două căi nu poate determina dacă o parte a adăugat un rând sau cealaltă l-a șters. Merql adaugă un instantaneu de bază pentru a clarifica acest lucru, îmbină două seturi de modificări și funcționează și cu MySQL. |
| Doctrine Migrations | Potrivit pentruDoctrine Migrations gestionează versiunile schemei bazei de date, astfel încât modificările acesteia să poată fi revizuite și testate înainte de a fi implementate în producție. | Diferența față de MerqlMerql nu este un instrument de migrare a schemei. Îmbină datele rândurilor și raportează coloanele adăugate sau eliminate între instantanee, lăsând modificarea schemei în seama dumneavoastră. |
Întrebări și răspunsuri
Răspunsuri scurte din documentația Merql.
MySQL și SQLite, prin adaptoarele PDO sau mysqli. Pentru alt motor, scrieți o clasă care implementează interfața Driver și înregistrați-o cu DriverFactory::register().
Nu. Nu migrează scheme, nu replică baze de date și nu le sincronizează în timp real. Pornind de la trei stări ale unei baze de date, produce o a patra stare, îmbinată, și identifică conflictele.
Când ambele părți modifică aceeași coloană din același rând la valori diferite, când o parte actualizează un rând pe care cealaltă l-a șters sau când ambele inserează un rând cu aceeași cheie. Editările în coloane diferite ale aceluiași rând se îmbină fără probleme.
Nu. Acestea citesc fișierele cu instantanee salvate, deci doar crearea unui instantaneu și aplicarea unui rezultat se conectează la baza de date.
Da. Creați un plan de îmbinare, selectați grupuri de modificări după ID-urile lor și transformați selecția într-un rezultat curat pentru Merql::apply() sau Merql::applyGuarded().
Doar dacă optați pentru aceasta, construind un ThreeWayMerge cu un CellMergeConfig, de exemplu CellMergeConfig::auto(). Merql::merge(), Merql::plan() și facade-ul CLI tratează fiecare valoare de coloană ca întreg.
Urmați ghidul de la primul instantaneu până la planurile de îmbinare, aplicarea protejată și anulare.