Pereiti prie turinio

Merql

Grynasis PHP trijų krypčių duomenų bazių sujungimas su konfliktų sprendimu stulpelių lygmeniu. Git stiliaus sujungimo semantika taikoma MySQL ir SQLite lentelėms.

Terminalas
composer require merql/merql

Naujausia versija v0.4.1 MIT PHP 8.2+

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.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

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.

Merql palyginimas su kitais įrankiais
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.

Klausimai ir atsakymai

Trumpi atsakymai iš Merql dokumentacijos.

Vadovaukitės instrukcijomis nuo pirmosios momentinės kopijos iki sujungimo planų, apsaugoto pritaikymo ir atšaukimo.