Przejdź do treści

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
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"
    }
}

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ść null we 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().

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
}