Treci la conținut

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.

Terminal
composer require merql/merql

Cea mai recentă versiune v0.4.1 MIT PHP 8.2+

Î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.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Î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.

Merql în comparație cu alte instrumente
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.

Urmați ghidul de la primul instantaneu până la planurile de îmbinare, aplicarea protejată și anulare.