Liigu sisu juurde

Skeemi valideerimine

Kui skeemid hetktõmmiste vahel muutuvad (veerge lisatakse, eemaldatakse või nimetatakse ümber), tuvastab merql need erinevused ja annab neist teada. Skeemierinevused ei takista ühendamist, kuid need tuuakse esile, et kutsuja saaks otsustada, kuidas edasi minna.

Tuvastamine

SchemaValidator::validate() võrdleb iga tabeli veergude kogumeid aluse, meie oma ja nende hetktõmmistes. See annab teada:

  • Meie omasse lisatud veerud (olemas meie omas, puuduvad aluses)
  • Meie omast eemaldatud veerud (olemas aluses, puuduvad meie omas)
  • Nende omasse lisatud veerud
  • Nende omast eemaldatud veerud
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"
    }
}

Mida tuvastatakse

Muutus Tuvastatakse Märkused
Veerg lisatud Jah Teatatakse kummagi poole kohta (meie/nende)
Veerg eemaldatud Jah Teatatakse kummagi poole kohta
Veeru tüüp muudetud Ei Tüübid salvestatakse, kuid neid ei võrrelda
Veerg ümber nimetatud Ei Käsitletakse lisamise ja eemaldamisena
Primaarvõti muudetud Ei Identiteet fikseeritakse hetktõmmise tegemisel

Käitumine ühendamisel

Kui veerg on ühes hetktõmmises olemas, kuid teises mitte, käsitleb ühendamine puuduva veeru väärtusena null. See tähendab järgmist:

  • Nende omasse lisatud veeru nullist erinev väärtus kuvatakse väärtusena null -> value (nende muudatus võetakse vastu)
  • Nende omast eemaldatud veeru väärtuseks loetakse kõigis nende ridades null

Ühendamine jätkub ja annab tulemuse. Skeemierinevused on üksnes teavitavad. Kutsuja peaks enne rakendamist kontrollima, kas sihtandmebaasi skeem vastab ühendatud andmetele.

Erinevuste vaatamine

Skeemierinevused on saadaval nii objektis ThreeWayMerge (meetodi schemaMismatches() kaudu) kui ka objektis MergeResult (meetodite schemaMismatches() ja hasSchemaMismatches() kaudu). Need säilivad ka pärast 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
}