Walidacja schematu
Gdy schematy zmieniają się między migawkami (dodawane, usuwane lub zmieniane są nazwy kolumn), merql wykrywa te różnice i je zgłasza. Niezgodności schematów nie blokują scalania, ale są sygnalizowane, aby wywołujący mógł zdecydować, jak postąpić.
Wykrywanie
SchemaValidator::validate() porównuje zestawy kolumn każdej tabeli w migawkach base, ours i theirs. Zgłasza:
- Kolumny dodane w ours (obecne w ours, ale nie w base)
- Kolumny usunięte w ours (obecne w base, ale nie w ours)
- Kolumny dodane w theirs
- Kolumny usunięte w 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"
}
}
Wykrywane zmiany
| Zmiana | Wykrywana | Uwagi |
|---|---|---|
| Dodana kolumna | Tak | Zgłaszana osobno dla każdej strony (ours/theirs) |
| Usunięta kolumna | Tak | Zgłaszana osobno dla każdej strony |
| Zmieniony typ kolumny | Nie | Typy są zapisywane, ale nie są porównywane |
| Zmieniona nazwa kolumny | Nie | Jest wykrywana jako dodanie i usunięcie |
| Zmieniony klucz główny | Nie | Tożsamość jest ustalana w chwili tworzenia migawki |
Zachowanie podczas scalania
Gdy kolumna występuje w jednej migawce, ale nie w innej, brakującą wartość kolumny podczas scalania traktuje się jako null. Oznacza to, że:
- Kolumna dodana w theirs z wartością różną od null jest traktowana jako
null -> value(zmiana theirs zostaje zaakceptowana) - Kolumna usunięta w theirs jest traktowana tak, jakby miała wartość
nullwe wszystkich wierszach theirs
Scalanie jest kontynuowane i zwraca wynik. Niezgodności schematów mają charakter informacyjny. Przed zastosowaniem zmian wywołujący powinien sprawdzić, czy schemat docelowej bazy danych odpowiada scalonym danym.
Dostęp do informacji o niezgodnościach
Niezgodności schematów są dostępne zarówno w ThreeWayMerge (przez schemaMismatches()), jak i w MergeResult (przez schemaMismatches() i hasSchemaMismatches()). Są zachowywane przez 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
}