Към съдържанието

Валидиране на схемата

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