Overenie schémy
Keď sa schémy medzi snímkami vyvíjajú (pridávajú sa, odstraňujú alebo premenúvajú stĺpce), merql tieto rozdiely zisťuje a hlási. Nesúlad schém neblokuje zlúčenie, no zobrazí sa, aby sa volajúca aplikácia mohla rozhodnúť, ako pokračovať.
Zisťovanie
SchemaValidator::validate() porovnáva množiny stĺpcov každej tabuľky v snímkach base, ours a theirs. Hlási:
- Stĺpce pridané v ours (sú v ours, ale nie v base)
- Stĺpce odstránené v ours (sú v base, ale nie v ours)
- Stĺpce pridané v theirs
- Stĺpce odstránené 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"
}
}
Čo sa zisťuje
| Zmena | Zistená | Poznámky |
|---|---|---|
| Pridaný stĺpec | Áno | Hlási sa osobitne pre každú stranu (ours/theirs) |
| Odstránený stĺpec | Áno | Hlási sa osobitne pre každú stranu |
| Zmenený typ stĺpca | Nie | Typy sa ukladajú, ale neporovnávajú |
| Premenovaný stĺpec | Nie | Zobrazí sa ako pridanie a odstránenie |
| Zmenený primárny kľúč | Nie | Identita sa určí pri vytvorení snímky |
Správanie počas zlúčenia
Keď stĺpec existuje v jednej snímke, ale v inej nie, pri zlúčení sa chýbajúca hodnota stĺpca považuje za null. To znamená:
- Stĺpec pridaný v theirs s hodnotou, ktorá nie je null, sa zobrazí ako
null -> value(prijme sa ako zmena v theirs) - Odstránený stĺpec v theirs sa bude považovať za taký, ktorý má vo všetkých riadkoch v theirs hodnotu
null
Zlúčenie pokračuje a vytvorí výsledok. Nesúlady schém majú informatívny charakter. Volajúca aplikácia by mala pred použitím overiť, či schéma cieľovej databázy zodpovedá zlúčeným údajom.
Prístup k nesúladom
Nesúlady schém sú dostupné v ThreeWayMerge (cez schemaMismatches()) aj v MergeResult (cez schemaMismatches() a hasSchemaMismatches()). Zachovávajú sa v 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
}