Hoppa till innehåll

Validering av schema

När scheman förändras mellan ögonblicksbilder (kolumner läggs till, tas bort eller byter namn) upptäcker merql skillnaderna och rapporterar dem. Schemaavvikelser blockerar inte sammanslagningen, men de visas så att anroparen kan avgöra hur den ska gå vidare.

Identifiering

SchemaValidator::validate() jämför kolumnuppsättningarna för varje tabell i ögonblicksbilderna base, ours och theirs. Den rapporterar:

  • Kolumner som lagts till i ours (finns i ours men inte i base)
  • Kolumner som tagits bort i ours (finns i base men inte i ours)
  • Kolumner som lagts till i theirs
  • Kolumner som tagits bort i 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"
    }
}

Vad som identifieras

Ändring Identifieras Anteckningar
Kolumn tillagd Ja Rapporteras per sida (ours/theirs)
Kolumn borttagen Ja Rapporteras per sida
Kolumntyp ändrad Nej Typer lagras men jämförs inte
Kolumn har bytt namn Nej Visas som tillägg + borttagning
Primärnyckel ändrad Nej Identiteten fastställs när ögonblicksbilden skapas

Beteende vid sammanslagning

När en kolumn finns i en ögonblicksbild men saknas i en annan behandlar sammanslagningen det saknade kolumnvärdet som null. Det innebär att:

  • En kolumn som lagts till i theirs med ett värde som inte är null visas som null -> value (accepteras som deras ändring)
  • En kolumn som tagits bort i theirs visas som om den hade null för alla rader i theirs

Sammanslagningen fortsätter och ger ett resultat. Schemaavvikelserna är endast informativa. Anroparen bör kontrollera att måldatabasens schema överensstämmer med de sammanslagna uppgifterna innan de tillämpas.

Åtkomst till avvikelser

Schemaavvikelser finns både på ThreeWayMerge (via schemaMismatches()) och på MergeResult (via schemaMismatches() och hasSchemaMismatches()). De bevaras genom 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
}