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
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
nullhad
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().
// 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
}