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
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
nullve 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().
// 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
}