Merql
Grynasis PHP trijų krypčių duomenų bazių sujungimas su konfliktų sprendimu stulpelių lygmeniu. Git stiliaus sujungimo semantika taikoma MySQL ir SQLite lentelėms.
composer require merql/merqlNaujausia versija 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']);Praktinis pritaikymas
Sujungimas nuskaito tris išsaugotas momentines kopijas ir grąžina įrašytinas operacijas bei spręstinus konfliktus.
Sujunkite tris momentines kopijas
Sukurkite bazinės versijos momentinę kopiją, kol abi kopijos dar neišsiskyrė, tada sukurkite kiekvienos pusės, pavyzdžiui, veikiančios duomenų bazės ir jos smėliadėžės kopijos, momentinę kopiją. ThreeWayMerge palygina abiejų pusių pakeitimus su bazine versija ir sujungia abu pakeitimų rinkinius.
Rezultatų skirtuke matyti, kad mūsų pusė redagavo content, o jų pusė redagavo title ir status toje pačioje eilutėje, todėl sujungus išsaugomi visi trys pakeitimai ir nekyla konfliktas.
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" }Trijų krypčių sujungimas
Bazė, mūsų ir jų versija. Tai git tipo trijų krypčių sujungimas pagal raktus, taikomas duomenų bazės eilutėms ir stulpeliams, o ne kodo eilutėms. Aptinka įterpimus, atnaujinimus ir ištrynimus dviejose šakose.
Sprendimas stulpelių lygmeniu
Kai abi pusės pakeičia tą pačią eilutę, merql lygina ją stulpelis po stulpelio. Konfliktas kyla tik tada, kai tas pats stulpelis pakeičiamas į skirtingas reikšmes.
Pasirenkamas langelių sujungimas
Perduokite CellMergeConfig į ThreeWayMerge, ir TEXT stulpeliai bus sujungiami eilutė po eilutės, naudojant Myers diff, o JSON stulpeliai – pagal raktą. Merql fasadas ir CLI šios funkcijos neįjungia.
Kelios duomenų bazės
Prijungiami ryšio adapteriai ir SQL dialektų tvarkyklės; MySQL ir SQLite įtraukti iš karto.
Konfliktų aptikimas
Atnaujinimas ir atnaujinimas, atnaujinimas ir ištrynimas, ištrynimas ir atnaujinimas, įterpimas ir įterpimas – apie kiekvieną atvejį pranešama nurodant lentelę ir eilutę. Jei konfliktuoja du atnaujinimai, nurodomas ir stulpelis.
SQL generavimas
Parametrizuoti INSERT, UPDATE, DELETE sakiniai, išrikiuoti atsižvelgiant į FK. Galima peržiūrėti bandomąjį vykdymą arba taikyti pakeitimus duomenų bazės transakcijoje.
CLI
Kurkite momentines kopijas, skirtumų ataskaitas ir sujungimus komandinėje eilutėje. Palaikomos MySQL ir SQLite, konfigūruojamos aplinkos kintamaisiais.
Išbandyta
32 regresijos scenarijai su ranka parengtais tikėtinais rezultatais (composer test:oracle). CI vykdo 231 vienetų ir integracinius testus bei PHPStan 10 lygį.
Kodėl Merql
Momentinės kopijos yra failai
Kiekviena momentinė kopija yra vienas JSON failas, kurį galite kopijuoti iš vieno kompiuterio į kitą arba įtraukti į versijų kontrolę. Skirtumų palyginimas ir sujungimas nuskaito šiuos failus, todėl jiems nereikia duomenų bazės ryšio.
Peržiūrėkite prieš įrašydami
Sujungimo plane kiekvienai operacijai ir pakeitimų grupei priskiriamas nekintantis ID, taip pat išsaugomos bazinės versijos, mūsų, jų ir galutinės eilutės. Pasirinkite norimas grupes ir pritaikykite tik jas.
Pasenę planai sustabdomi
Apsaugotas pritaikymas rašo tik į tas eilutes, kurios vis dar atitinka peržiūrėtą momentinę kopiją. Jei sakinys nepaveikia nė vienos eilutės, operacija atšaukiama, o rezultate pateikiama klaida.
Atšaukimas tikrinant nukrypimus
Sukurkite atšaukimo planą iš veikiančių eilučių prieš pat įrašymą ir išsaugokite jį kaip JSON. Prieš atšaukiant, nukrypimų patikra palygina eilučių kontrolines sumas ir pateikia operacijas, kurių eilutės nuo tada buvo pakeistos.
Palyginimas su
Merql sujungia trijų momentinių kopijų eilučių duomenis. Šie įrankiai versijuoja, sinchronizuoja arba migruoja duomenų bazes – tai gretimos užduotys.
| Įrankis | Stipriosios pusės | Skirtumas nuo Merql |
|---|---|---|
| Dolt | Stipriosios pusėsDolt yra SQL duomenų bazė, kurią galite išsišakoti, klonuoti, skaidyti į šakas, sujungti, siųsti ir gauti kaip Git saugyklą. Prie jos jungiatės kaip prie bet kurios MySQL duomenų bazės, o ji seka kiekvieno langelio kilmę. | Skirtumas nuo MerqlMerql išsaugo jūsų jau naudojamą MySQL arba SQLite duomenų bazę. Jis išsaugo lenteles kaip JSON momentinių kopijų failus ir sujungia tris jų kopijas, o bazinę kopiją pasirenkate jūs. |
| pt-table-sync | Stipriosios pusėspt-table-sync randa ir ištaiso skirtumus tarp MySQL lentelių – viena kryptimi arba abiem kryptimis tarp serverių. Sinchronizuodamas repliką, jis pakeitimus atlieka replikavimo šaltinyje. | Skirtumas nuo MerqlSinchronizuojant abiem kryptimis, pt-table-sync pagal konfliktų stulpelį pasirenka laiminčią eilutę ir nukopijuoja jos reikšmes. Merql lygina abi puses su bendra bazine versija, sujungia tos pačios eilutės pakeitimus skirtinguose stulpeliuose, o nesuderinamus pakeitimus pateikia kaip konfliktus, kuriuos turite išspręsti. |
| sqldiff | Stipriosios pusėssqldiff palygina dvi SQLite duomenų bazes ir išveda SQL scenarijų, kuris paverčia pirmąją duomenų bazę antrąja. Jis taip pat gali įrašyti dvejetainį pakeitimų rinkinį, skirtą SQLite seanso plėtiniui, arba apibendrinti kiekvienos lentelės pakeistas eilutes. | Skirtumas nuo MerqlDviejų krypčių skirtumų palyginimas neparodo, ar eilutę pridėjo viena pusė, ar ištrynė kita. Merql tam naudoja bazinę momentinę kopiją, sujungia du pakeitimų rinkinius ir veikia su MySQL. |
| Doctrine Migrations | Stipriosios pusėsDoctrine Migrations versijuoja duomenų bazės schemą, todėl schemos pakeitimus galima peržiūrėti ir išbandyti prieš juos diegiant gamybinėje aplinkoje. | Skirtumas nuo MerqlMerql nėra schemų migravimo įrankis. Jis sujungia eilučių duomenis ir praneša apie tarp momentinių kopijų pridėtus arba pašalintus stulpelius, o schemos pakeitimą atliekate patys. |
Šaltiniai, pažymėta
Klausimai ir atsakymai
Trumpi atsakymai iš Merql dokumentacijos.
MySQL ir SQLite per PDO arba mysqli adapterius. Kitam varikliui parašykite klasę, kuri įgyvendina Driver sąsają, ir užregistruokite ją naudodami DriverFactory::register().
Ne. Jis nemigruoja schemų, nereplikuoja duomenų bazių ir nesinchronizuoja jų realiuoju laiku. Gavęs tris duomenų bazės būsenas, jis sukuria sujungtą ketvirtą būseną ir nurodo konfliktus.
Kai abi pusės pakeičia tą patį tos pačios eilutės stulpelį į skirtingas reikšmes, kai viena pusė atnaujina eilutę, kurią kita ištrynė, arba kai abi įterpia eilutę su tuo pačiu raktu. Skirtingų vienos eilutės stulpelių pakeitimai sujungiami sklandžiai.
Ne. Operacijos nuskaito išsaugotus momentinių kopijų failus, todėl prie duomenų bazės jungiamasi tik kuriant momentinę kopiją ir pritaikant rezultatą.
Taip. Sukurkite sujungimo planą, pasirinkite pakeitimų grupes pagal jų ID ir paverskite pasirinkimą į švarų rezultatą, skirtą Merql::apply() arba Merql::applyGuarded().
Tik jei įjungsite šią funkciją kurdami ThreeWayMerge su CellMergeConfig, pavyzdžiui, CellMergeConfig::auto(). Merql::merge(), Merql::plan() ir CLI kiekvieną stulpelio reikšmę laiko nedaloma visuma.
Vadovaukitės instrukcijomis nuo pirmosios momentinės kopijos iki sujungimo planų, apsaugoto pritaikymo ir atšaukimo.