Gå til indhold

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
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"
    }
}

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 null for 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().

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
}