Ga naar de inhoud

Schemavalidatie

Wanneer schema's tussen snapshots veranderen (kolommen worden toegevoegd, verwijderd of hernoemd), detecteert en rapporteert merql deze verschillen. Schema-afwijkingen blokkeren de merge niet, maar worden zichtbaar gemaakt zodat de aanroeper kan beslissen hoe verder te gaan.

Detectie

SchemaValidator::validate() vergelijkt de kolomverzamelingen van elke tabel in de snapshots base, ours en theirs. Het rapporteert:

  • Kolommen toegevoegd in ours (aanwezig in ours maar niet in base)
  • Kolommen verwijderd in ours (aanwezig in base maar niet in ours)
  • Kolommen toegevoegd in theirs
  • Kolommen verwijderd in 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"
    }
}

Wat wordt gedetecteerd

Wijziging Gedetecteerd Opmerkingen
Kolom toegevoegd Ja Per zijde gerapporteerd (ours/theirs)
Kolom verwijderd Ja Per zijde gerapporteerd
Kolomtype gewijzigd Nee Typen worden opgeslagen, maar niet vergeleken
Kolom hernoemd Nee Verschijnt als toevoeging en verwijdering
Primaire sleutel gewijzigd Nee Identiteit ligt vast op het moment van de snapshot

Gedrag tijdens de merge

Als een kolom wel in de ene snapshot bestaat maar niet in de andere, behandelt de merge de ontbrekende kolomwaarde als null. Dit betekent:

  • Een kolom die in theirs is toegevoegd met een niet-nullwaarde verschijnt als null -> value (geaccepteerd als wijziging van theirs)
  • Een kolom die in theirs is verwijderd, wordt voor alle rijen in theirs behandeld alsof deze null had

De merge wordt uitgevoerd en levert een resultaat op. De schema-afwijkingen zijn informatief. De aanroeper moet controleren of het schema van de doeldatabase overeenkomt met de samengevoegde gegevens voordat deze worden toegepast.

Afwijkingen bekijken

Schema-afwijkingen zijn beschikbaar op zowel ThreeWayMerge (via schemaMismatches()) als op MergeResult (via schemaMismatches() en hasSchemaMismatches()). Ze blijven behouden via 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
}