Перейти до вмісту

Перевірка схеми

Коли схема змінюється між знімками (стовпці додаються, вилучаються або перейменовуються), merql виявляє ці відмінності та повідомляє про них. Невідповідності схем не блокують злиття, але відображаються, щоб викликач міг вирішити, як діяти далі.

Виявлення

SchemaValidator::validate() порівнює набори стовпців кожної таблиці у знімках base, ours і theirs. Звіт містить:

  • Стовпці, додані в ours (є в ours, але немає в base)
  • Стовпці, вилучені з ours (є в base, але немає в ours)
  • Стовпці, додані в theirs
  • Стовпці, вилучені з 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"
    }
}

Що виявляється

Зміна Виявляється Примітки
Додано стовпець Так Звіт окремо для кожної сторони (ours/theirs)
Вилучено стовпець Так Звіт окремо для кожної сторони
Змінено тип стовпця Ні Типи зберігаються, але не порівнюються
Перейменовано стовпець Ні Відображається як додавання та вилучення
Змінено первинний ключ Ні Ідентичність фіксується під час створення знімка

Поведінка під час злиття

Якщо стовпець є в одному знімку, але відсутній в іншому, злиття вважає значення відсутнього стовпця значенням null. Це означає:

  • Стовпець, доданий у theirs з ненульовим значенням, відображається як null -> value (зміна theirs приймається)
  • Стовпець, вилучений у theirs, вважається таким, що має null для всіх рядків у theirs

Злиття продовжується та створює результат. Невідповідності схем мають інформаційний характер. Перед застосуванням результату викликач має перевірити, чи відповідає схема цільової бази даних об’єднаним даним.

Перегляд невідповідностей

Невідповідності схем доступні як у ThreeWayMerge (через schemaMismatches()), так і в MergeResult (через schemaMismatches() та hasSchemaMismatches()). Вони зберігаються під час 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
}