Pāriet uz saturu

Merql

Tīra PHP trīsvirzienu datubāzu apvienošana ar konfliktu atrisināšanu kolonnu līmenī. Git tipa apvienošanas semantika piemērota MySQL un SQLite tabulām.

Terminālis
composer require merql/merql

Jaunākais laidiens v0.4.1 MIT PHP 8.2+

Praksē

Apvienošana nolasa trīs saglabātus momentuzņēmumus un atgriež ierakstāmās darbības un atrisināmos konfliktus.

Apvienojiet trīs momentuzņēmumus

Izveidojiet sākotnējā stāvokļa momentuzņēmumu, pirms abas kopijas atšķiras, un pēc tam uzņemiet katras puses momentuzņēmumu, piemēram, darbības vides datubāzei un smilškastes kopijai. ThreeWayMerge salīdzina abas puses ar sākotnējo stāvokli un apvieno abas izmaiņu kopas.

Rezultātu cilnē redzams, ka mūsu pusē labota content, bet viņu pusē — title un status tajā pašā rindā, tāpēc apvienošanā saglabātas visas trīs izmaiņas bez konflikta.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Trīsvirzienu sapludināšana

Sākotnējais stāvoklis, mūsu un viņu izmaiņas. Tā ir git tipa trīspusēja apvienošana datubāzes rindām ar atslēgām un kolonnām, nevis teksta rindām. Nosaka ievietojumus, atjauninājumus un dzēsumus divos zaros.

Konfliktu atrisināšana kolonnu līmenī

Ja abas puses maina vienu un to pašu rindu, merql salīdzina katru kolonnu atsevišķi. Konflikts rodas tikai tad, ja vienā un tajā pašā kolonnā iestatītas atšķirīgas vērtības.

Šūnu apvienošana pēc izvēles

Padodiet ThreeWayMerge objektam CellMergeConfig, un TEXT kolonnas tiks apvienotas pa rindām, izmantojot Myers diff, bet JSON kolonnas — pēc atslēgām. Merql fasāde un CLI to neieslēdz.

Vairākas datubāzes

Pievienojami savienojumu adapteri un dialektu draiveri; iekļauti MySQL un SQLite.

Konfliktu noteikšana

Atjaunināšana pret atjaunināšanu, atjaunināšana pret dzēšanu, dzēšana pret atjaunināšanu un ievietošana pret ievietošanu — katrs gadījums tiek uzrādīts kopā ar tabulu un rindu. Atjaunināšanas konfliktos tiek norādīta arī kolonna.

SQL ģenerēšana

Parametrizēti INSERT, UPDATE, DELETE priekšraksti ar FK secības ņemšanu vērā. Priekšskatiet bez izpildes vai lietojiet transakcijā.

CLI

Izveidojiet momentuzņēmumus, salīdziniet un apvienojiet no komandrindas. Atbalsta MySQL un SQLite, izmantojot vides mainīgos.

Pārbaudīts

32 regresijas scenāriji ar pašu veidotiem sagaidāmajiem rezultātiem (composer test:oracle). CI palaiž 231 vienību un integrācijas testus, kā arī PHPStan 10. līmeni.

Kāpēc Merql

Momentuzņēmumi ir faili

Katrs momentuzņēmums ir viens JSON fails, ko var kopēt starp ierīcēm vai pievienot versiju kontrolei. Salīdzināšana un apvienošana nolasa šos failus, tāpēc tās darbojas bez datubāzes savienojuma.

Pārskatiet pirms ierakstīšanas

Apvienošanas plānā katrai darbībai un izmaiņu grupai ir stabils ID, un tajā tiek saglabātas sākotnējā stāvokļa, mūsu, viņu un rezultāta rindas. Atlasiet vajadzīgās grupas un lietojiet tikai tās.

Novecojuši plāni tiek apturēti

Aizsargātā lietošana ieraksta tikai tajās rindās, kas joprojām atbilst pārskatītajam momentuzņēmumam. Ja priekšraksts neietekmē nevienu rindu, transakcija tiek atcelta un rezultātā iekļauta kļūda.

Atcelšana ar novirzes pārbaudi

Izveidojiet atcelšanas plānu no darbības vides rindām tieši pirms ierakstīšanas un saglabājiet to kā JSON. Pirms atcelšanas novirzes pārbaudē tiek salīdzināti rindu pirkstu nospiedumi un atgrieztas tās darbības, kuru rindas kopš tā laika ir mainījušās.

Salīdzinājums ar

Merql apvieno rindu datus no trim momentuzņēmumiem. Šie rīki versē, sinhronizē vai migrē datubāzes — tie ir saistīti uzdevumi.

Merql salīdzinājumā ar citiem rīkiem
Dolt PiemērotsDolt ir SQL datubāze, ko var atdalīt, klonēt, sadalīt zaros, apvienot, nosūtīt un saņemt līdzīgi kā Git repozitoriju. Tai var pievienoties tāpat kā jebkurai MySQL datubāzei, un tā seko katras šūnas izcelsmei. Atšķirība no MerqlMerql saglabā jau izmantoto MySQL vai SQLite datubāzi. Tas saglabā tabulas kā JSON momentuzņēmumu failus un apvieno trīs no tiem, jums izvēloties sākotnējā stāvokļa momentuzņēmumu.
pt-table-sync Piemērotspt-table-sync atrod un labo atšķirības starp MySQL tabulām vienā virzienā vai abos virzienos starp serveriem. Sinhronizējot repliku, izmaiņas tiek veiktas replikācijas avotā. Atšķirība no MerqlDivvirzienu sinhronizācijā pt-table-sync izvēlas uzvarējušo rindu pēc konflikta kolonnas un kopē tās vērtības. Merql salīdzina abas puses ar kopīgu sākotnējo stāvokli, apvieno vienas rindas dažādu kolonnu labojumus un uzrāda nesaderīgas izmaiņas kā atrisināmus konfliktus.
sqldiff Piemērotssqldiff salīdzina divas SQLite datubāzes un izdrukā SQL skriptu, kas pārveido pirmo par otro. Tas var arī izveidot bināru izmaiņu kopu SQLite sesijas paplašinājumam vai apkopot katras tabulas mainītās rindas. Atšķirība no MerqlDivvirzienu salīdzinājums nevar noteikt, vai vienā pusē rinda pievienota vai otrā dzēsta. Merql pievieno sākotnējā stāvokļa momentuzņēmumu, lai to noskaidrotu, apvieno divas izmaiņu kopas un darbojas arī ar MySQL.
Doctrine Migrations PiemērotsDoctrine Migrations versē datubāzes shēmu, lai shēmas izmaiņas varētu pārskatīt un pārbaudīt pirms to izvietošanas produkcijas vidē. Atšķirība no MerqlMerql nav shēmas migrēšanas rīks. Tas apvieno rindu datus un uzrāda starp momentuzņēmumiem pievienotās vai noņemtās kolonnas, bet par shēmas izmaiņām jāparūpējas jums.

Jautājumi un atbildes

Īsas atbildes no Merql dokumentācijas.

Sekojiet ceļvedim no pirmā momentuzņēmuma līdz apvienošanas plāniem, aizsargātai lietošanai un atcelšanai.