Проверка схемы
Если между снимками меняется схема (добавляются, удаляются или переименовываются столбцы), merql обнаруживает и сообщает об этих различиях. Несовпадение схем не блокирует слияние, но отображается, чтобы вызывающая сторона могла решить, как действовать.
Обнаружение
SchemaValidator::validate() сравнивает наборы столбцов каждой таблицы в снимках базы, нашего и их вариантов. Отчет включает:
- Столбцы, добавленные в нашем варианте (есть в нем, но нет в базе)
- Столбцы, удаленные из нашего варианта (есть в базе, но нет в нем)
- Столбцы, добавленные в их варианте
- Столбцы, удаленные из их варианта
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().
// 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
}