Merql
Puhas PHP kolme osapoole andmebaasiliitmine koos veerutaseme konfliktide lahendamisega. Git-laadne liitmise semantika MySQL ja SQLite tabelitele.
composer require merql/merqlViimane väljalase 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']);Praktikas
Ühendamine loeb kolme salvestatud hetktõmmist ja tagastab kirjutatavad toimingud ning lahendamist vajavad konfliktid.
Ühenda kolm hetktõmmist
Tee baasi hetktõmmis enne kahe koopia lahknemist, seejärel loo mõlemast poolest hetktõmmis, näiteks aktiivsest andmebaasist ja liivakasti koopiast. ThreeWayMerge võrdleb mõlemat poolt baasiga ja ühendab kaks muudatuste kogumit.
Tulemuse vahekaardil muutis meie pool content ning nende pool title ja status samas reas, nii et ühendamisel säilivad kõik kolm muudatust konfliktita.
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" }Kolme osapoole liitmine
Alus, meie muudatused, nende muudatused. git-laadne kolmesuunaline liitmine võtmega ridade ja veergude põhjal, mitte ridade kaupa. Tuvastab lisamised, uuendused ja kustutamised kahes harus.
Lahendamine veerutasemel
Kui mõlemad pooled muudavad sama rida, võrdleb merql veerge ükshaaval. Konflikt tekib ainult siis, kui sama veerg muudetakse erinevateks väärtusteks.
Lahtrite ühendamine valikulise seadistusega
Edasta ThreeWayMerge'ile CellMergeConfig ning TEXT-veerge ühendatakse Myersi diffi abil rida-realt ja JSON veerge võti-võtme haaval. Merql fassaad ja CLI seda ei luba.
Mitu andmebaasi
Vahetatavad ühenduseadapterid ja dialektidraiverid, sisseehitatud MySQL ja SQLite toega.
Konfliktide tuvastamine
Uuendamine vs. uuendamine, uuendamine vs. kustutamine, kustutamine vs. uuendamine ja lisamine vs. lisamine; iga konfliktiga esitatakse tabel ja rida. Uuendamise konfliktides nimetatakse ka veerg.
SQL genereerimine
Parameetritega INSERT-, UPDATE- ja DELETE-laused koos välisvõtmeid arvestava järjestusega. Kuivkäivituse eelvaade või rakendamine tehingus.
CLI
Loo käsurealt hetktõmmis, diff ja ühendamine. Toetab keskkonnamuutujate kaudu MySQL ja SQLite.
Testitud
32 käsitsi kirjutatud ootustega regressioonistsenaariumi (composer test:oracle). CI käivitab 231 ühik- ja integratsioonitestid ning PHPStan taseme 10.
Miks Merql
Hetktõmmised on failid
Iga hetktõmmis on üks JSON fail, mida saad masinate vahel kopeerida või versioonihaldusse lisada. Diff ja ühendamine loevad neid faile, seega töötavad need andmebaasiühenduseta.
Vaata üle enne kirjutamist
Ühendamisplaan annab igale toimingule ja muudatuste rühmale püsiva ID ning säilitab baasi, meie poole, nende poole ja tulemuse read. Vali soovitud rühmad ja rakenda ainult need.
Aegunud plaanid peatatakse
Kaitstud rakendus kirjutab ainult neisse ridadesse, mis vastavad endiselt üle vaadatud hetktõmmisele. Kui lause mõjutab null rida, tehakse tehing tagasi ja tulemuses kuvatakse viga.
Tagasipööre koos muutuste kontrolliga
Koosta tagasipööramisplaan aktiivsete ridade põhjal vahetult enne kirjutamist ja salvesta see kui JSON. Enne tagasipööramist võrdleb muutuste kontroll ridade sõrmejälgi ja tagastab toimingud, mille read on vahepeal muutunud.
Võrdlus
Merql ühendab kolme hetktõmmise ridade andmed. Need tööriistad versioonivad, sünkroonivad või migreerivad andmebaase, mis on seotud, kuid eraldi ülesanded.
| Tööriist | Sobib hästi | Erinevus võrreldes Merql-ga |
|---|---|---|
| Dolt | Sobib hästiDolt on SQL andmebaas, mida saab nagu Git hoidlat hargneda, kloonida, harusid luua, ühendada, üles lükata ja alla tõmmata. Sellega ühendutakse nagu iga MySQL andmebaasiga ning see jälgib iga lahtri päritolu. | Erinevus võrreldes Merql-gaMerql jätab alles sinu olemasoleva MySQL või SQLite andmebaasi. See salvestab tabelid JSON hetktõmmisfailidena ja ühendab neist kolm; sina valid baasi hetktõmmise. |
| pt-table-sync | Sobib hästipt-table-sync leiab ja parandab erinevused MySQL tabelite vahel ühes või mõlemas suunas serverite vahel. Replika sünkroonimisel teeb see muudatused replikatsiooni lähteallikas. | Erinevus võrreldes Merql-gaKahesuunalise sünkroonimise korral valib pt-table-sync võitjaks rea konfliktiveeru põhjal ja kopeerib selle väärtused. Merql võrdleb mõlemat poolt ühise baasiga, ühendab sama rea eri veergude muudatused ning annab ühildumatud muudatused sulle lahendamiseks konfliktidena teada. |
| sqldiff | Sobib hästisqldiff võrdleb kaht SQLite andmebaasi ja väljastab SQL skripti, mis muudab esimese teiseks. Samuti saab see kirjutada binaarse muudatuste kogumi SQLite seansilaienduse jaoks või teha tabelite kaupa muudetud ridade kokkuvõtte. | Erinevus võrreldes Merql-gaKahepoolne diff ei näita, kas ühelt poolt lisati rida või teiselt poolt kustutati see. Merql lisab vastuse leidmiseks baasi hetktõmmise, ühendab kaks muudatuste kogumit ja töötab ka MySQL-ga. |
| Doctrine Migrations | Sobib hästiDoctrine Migrations versioonib andmebaasi skeemi, nii et skeemimuudatused saab enne tootmiskeskkonda juurutamist üle vaadata ja testida. | Erinevus võrreldes Merql-gaMerql ei ole skeemi migratsioonitööriist. See ühendab ridade andmeid ja annab teada hetktõmmiste vahel lisatud või eemaldatud veergudest, jättes skeemimuudatuse sinu teha. |
Küsimused ja vastused
Lühikesed vastused Merql dokumentatsioonist.
MySQL ja SQLite PDO või mysqli adapterite kaudu. Teiste andmebaasimootorite jaoks loo klass, mis rakendab Driver-liidese, ja registreeri see DriverFactory::register() abil.
Ei. See ei migreeri skeeme, replikeeri andmebaase ega sünkrooni neid reaalajas. Kolme andmebaasi oleku põhjal loob see ühendatud neljanda oleku ja toob konfliktid esile.
Kui mõlemad pooled muudavad sama rea sama veeru erinevaks väärtuseks, kui üks pool uuendab rida, mille teine kustutas, või kui mõlemad lisavad sama võtmega rea. Sama rea eri veergude muudatused ühendatakse tõrgeteta.
Ei. Need loevad salvestatud hetktõmmisfaile, nii et andmebaasiga ühendutakse ainult hetktõmmise tegemisel ja tulemuse rakendamisel.
Jah. Koosta ühendamisplaan, vali muudatuste rühmad nende ID-de järgi ja loo valikust puhas tulemus Merql::apply() või Merql::applyGuarded() jaoks.
Ainult siis, kui lubad selle ThreeWayMerge'i loomisel CellMergeConfigi abil, näiteks CellMergeConfig::auto(). Merql::merge(), Merql::plan() ja CLI käsitlevad iga veeru väärtust tervikuna.
Järgi juhendit alates esimesest hetktõmmisest kuni ühendamisplaanide, kaitstud rakendamise ja tagasipööramiseni.