Treci la conținut

Validarea schemei

Când schemele evoluează între instantanee (se adaugă, elimină sau redenumesc coloane), merql detectează și raportează aceste diferențe. Nepotrivirile dintre scheme nu blochează îmbinarea, dar sunt semnalate pentru ca apelantul să decidă cum să procedeze.

Detectare

SchemaValidator::validate() compară seturile de coloane ale fiecărui tabel din instantaneele base, ours și theirs. Raportează:

  • Coloane adăugate în ours (prezente în ours, dar absente din base)
  • Coloane eliminate din ours (prezente în base, dar absente din ours)
  • Coloane adăugate în theirs
  • Coloane eliminate din 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"
    }
}

Ce se detectează

Modificare Detectată Note
Coloană adăugată Da Raportată pentru fiecare parte (ours/theirs)
Coloană eliminată Da Raportată pentru fiecare parte
Tip de coloană schimbat Nu Tipurile sunt stocate, dar nu sunt comparate
Coloană redenumită Nu Apare ca adăugare + eliminare
Cheie primară schimbată Nu Identitatea este fixată la momentul capturării instantaneului

Comportamentul în timpul îmbinării

Când o coloană există într-un instantaneu, dar nu în altul, îmbinarea tratează valoarea coloanei absente ca null. Asta înseamnă:

  • O coloană adăugată în theirs cu o valoare non-null apare ca null -> value (acceptată ca modificare din theirs)
  • O coloană eliminată în theirs apare ca având null pentru toate rândurile din theirs

Îmbinarea continuă și produce un rezultat. Nepotrivirile dintre scheme sunt informative. Apelantul trebuie să verifice dacă schema bazei de date țintă corespunde datelor îmbinate înainte de aplicare.

Accesarea nepotrivirilor

Nepotrivirile dintre scheme sunt disponibile atât în ThreeWayMerge (prin schemaMismatches()), cât și în MergeResult (prin schemaMismatches() și hasSchemaMismatches()). Acestea sunt păstrate prin 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
}