Валидиране на схемата
Когато схемите се променят между моментните снимки (добавят се, премахват се или преименуват колони), 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
}