Перейти к содержимому

Проверка схемы

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

Обнаружение

SchemaValidator::validate() сравнивает наборы столбцов каждой таблицы в снимках базы, нашего и их вариантов. Отчет включает:

  • Столбцы, добавленные в нашем варианте (есть в нем, но нет в базе)
  • Столбцы, удаленные из нашего варианта (есть в базе, но нет в нем)
  • Столбцы, добавленные в их варианте
  • Столбцы, удаленные из их варианта
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"
    }
}

Что обнаруживается

Изменение Обнаруживается Примечания
Добавление столбца Да Отчет формируется отдельно для каждой стороны (наш вариант/их вариант)
Удаление столбца Да Отчет формируется отдельно для каждой стороны
Изменение типа столбца Нет Типы сохраняются, но не сравниваются
Переименование столбца Нет Отображается как добавление и удаление
Изменение первичного ключа Нет Идентификатор фиксируется при создании снимка

Поведение при слиянии

Если столбец есть в одном снимке, но отсутствует в другом, при слиянии его значение считается равным null. Это означает:

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

Слияние выполняется и создает результат. Несовпадения схем носят информационный характер. Перед применением вызывающей стороне следует убедиться, что схема целевой базы данных соответствует объединенным данным.

Доступ к сведениям о несовпадениях

Несовпадения схем доступны как в 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
}