Pereiti prie turinio

Schemos tikrinimas

Kai skirtingose momentinėse kopijose keičiasi schemos (pridedami, pašalinami arba pervadinami stulpeliai), merql aptinka šiuos skirtumus ir apie juos praneša. Schemos neatitikimai nesustabdo sujungimo, tačiau yra parodomi, kad iškvietėjas galėtų nuspręsti, kaip elgtis toliau.

Aptikimas

SchemaValidator::validate() palygina kiekvienos lentelės stulpelių rinkinius base, ours ir theirs momentinėse kopijose. Pranešama apie:

  • Pusėje ours pridėtus stulpelius (yra ours, bet nėra base)
  • Pusėje ours pašalintus stulpelius (yra base, bet nėra ours)
  • Pusėje theirs pridėtus stulpelius
  • Pusėje theirs pašalintus stulpelius
PHP
use Merql\Merge\ThreeWayMerge;

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

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}

Kas aptinkama

Pakeitimas Aptinkama Pastabos
Stulpelis pridėtas Taip Pateikiama atskirai kiekvienai pusei (ours/theirs)
Stulpelis pašalintas Taip Pateikiama atskirai kiekvienai pusei
Stulpelio tipas pakeistas Ne Tipai saugomi, bet nelyginami
Stulpelis pervadintas Ne Rodomas kaip pridėjimas ir pašalinimas
Pirminis raktas pakeistas Ne Tapatybė nustatoma fiksuojant momentinę kopiją

Veikimas sujungimo metu

Jei stulpelis yra vienoje momentinėje kopijoje, bet jo nėra kitoje, sujungimo metu trūkstama stulpelio reikšmė laikoma null. Tai reiškia:

  • Jei pusėje theirs pridėtas stulpelis turi ne NULL reikšmę, ji rodoma kaip null -> value (pakeitimas iš theirs priimtas)
  • Jei pusėje theirs pašalintas stulpelis, laikoma, kad jo reikšmė visose theirs eilutėse yra null

Sujungimas tęsiamas ir pateikiamas rezultatas. Schemos neatitikimai yra informacinio pobūdžio. Prieš pritaikydamas sujungtus duomenis, iškvietėjas turėtų patikrinti, ar tikslinės duomenų bazės schema su jais sutampa.

Neatitikimų peržiūra

Schemos neatitikimus galima pasiekti per ThreeWayMerge (naudojant schemaMismatches()) ir per MergeResult (naudojant schemaMismatches() ir hasSchemaMismatches()). Jie išsaugomi per ConflictResolver::resolve().

PHP
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}