Přejít k obsahu

Ověření schématu

Když se schémata mezi snímky vyvíjejí (přidávají, odebírají nebo přejmenovávají se sloupce), merql tyto rozdíly zjistí a oznámí. Neshody ve schématu neblokují sloučení, ale systém je zobrazí, aby volající mohl rozhodnout, jak pokračovat.

Zjišťování

SchemaValidator::validate() porovnává sady sloupců jednotlivých tabulek napříč snímky base, ours a theirs. Oznamuje:

  • Sloupce přidané v ours (jsou v ours, ale ne v base)
  • Sloupce odebrané v ours (jsou v base, ale ne v ours)
  • Sloupce přidané v theirs
  • Sloupce odebrané v theirs
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"
    }
}

Co se zjišťuje

Změna Zjištěna Poznámky
Přidaný sloupec Ano Hlásí se pro každou stranu (ours/theirs)
Odebraný sloupec Ano Hlásí se pro každou stranu
Změněný typ sloupce Ne Typy se ukládají, ale neporovnávají
Přejmenovaný sloupec Ne Zobrazí se jako přidání a odebrání
Změněný primární klíč Ne Identita se při pořizování snímku nemění

Chování při sloučení

Pokud sloupec existuje v jednom snímku, ale v jiném chybí, sloučení považuje chybějící hodnotu sloupce za null. To znamená:

  • Přidaný sloupec v theirs s hodnotou jinou než null se zobrazí jako null -> value (změna theirs je přijata)
  • Odebraný sloupec v theirs se zobrazí, jako by měl hodnotu null ve všech řádcích theirs

Sloučení pokračuje a vytvoří výsledek. Neshody ve schématu jsou pouze informativní. Volající by měl před použitím ověřit, že schéma cílové databáze odpovídá sloučeným datům.

Přístup k neshodám

Neshody ve schématu jsou dostupné v ThreeWayMerge (přes schemaMismatches()) i v MergeResult (přes schemaMismatches() a hasSchemaMismatches()). Zachovají se také prostřednictvím 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
}