Skemavalidering
Når skemaer ændres mellem øjebliksbilleder (kolonner tilføjes, fjernes eller omdøbes), registrerer og rapporterer merql forskellene. Skemaforskelle blokerer ikke en merge, men vises, så den kaldende part kan beslutte, hvordan den vil fortsætte.
Registrering
SchemaValidator::validate() sammenligner kolonnesættene for hver tabel på tværs af øjebliksbillederne for base, vores og deres. Den rapporterer:
- Kolonner tilføjet hos os (findes hos os, men ikke i grundlaget)
- Kolonner fjernet hos os (findes i grundlaget, men ikke hos os)
- Kolonner tilføjet hos dem
- Kolonner fjernet hos dem
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"
}
}
Hvad registreres
| Ændring | Registreres | Bemærkninger |
|---|---|---|
| Kolonne tilføjet | Ja | Rapporteres for hver side (ours/theirs) |
| Kolonne fjernet | Ja | Rapporteres for hver side |
| Kolonnetype ændret | Nej | Typer gemmes, men sammenlignes ikke |
| Kolonne omdøbt | Nej | Vises som tilføjelse + fjernelse |
| Primærnøgle ændret | Nej | Identiteten fastlægges på snapshot-tidspunktet |
Adfærd under sammenfletning
Når en kolonne findes i ét snapshot, men ikke i et andet, behandler sammenfletningen værdien for den manglende kolonne som null. Det betyder:
- En kolonne, der er tilføjet hos dem med en ikke-null-værdi, vises som
null -> value(accepteres som deres ændring) - En kolonne, der er fjernet hos dem, vises med
nullfor alle rækker hos dem
Sammenfletningen fortsætter og giver et resultat. Skemaforskellene er kun til orientering. Kaldende kode bør kontrollere, at måldatabasens skema passer til de sammenflettede data, før de anvendes.
Adgang til forskelle
Skemaforskelle er tilgængelige både på ThreeWayMerge (via schemaMismatches()) og på MergeResult (via schemaMismatches() og hasSchemaMismatches()). De bevares gennem 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
}