Preskoči na vsebino

Preverjanje sheme

Ko se sheme med posnetki spreminjajo (stolpci so dodani, odstranjeni ali preimenovani), merql zazna te razlike in o njih poroča. Neskladja shem ne preprečijo združevanja, vendar so prikazana, da se klicatelj lahko odloči, kako nadaljevati.

Zaznavanje

SchemaValidator::validate() primerja nabore stolpcev vsake tabele v posnetkih osnovnega stanja, naše kopije in njihove kopije. Poroča o:

  • Stolpci, dodani v naši kopiji (prisotni v naši kopiji, ne pa v osnovnem stanju)
  • Stolpci, odstranjeni iz naše kopije (prisotni v osnovnem stanju, ne pa v naši kopiji)
  • Stolpci, dodani v njihovi kopiji
  • Stolpci, odstranjeni iz njihove kopije
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"
    }
}

Kaj se zazna

Sprememba Zaznano Opombe
Dodan stolpec Da Poročilo za vsako stran (našo/njihovo)
Odstranjen stolpec Da Poročilo za vsako stran
Spremenjen tip stolpca Ne Tipi so shranjeni, vendar se ne primerjajo
Preimenovan stolpec Ne Prikaže se kot dodajanje in odstranitev
Spremenjen primarni ključ Ne Identiteta je določena ob ustvarjanju posnetka

Obnašanje med združevanjem

Ko stolpec obstaja v enem posnetku, v drugem pa ne, združevanje obravnava manjkajočo vrednost stolpca kot null. To pomeni:

  • Stolpec, dodan v njihovi kopiji z vrednostjo, ki ni null, se prikaže kot null -> value (sprejeta je sprememba njihove kopije)
  • Stolpec, odstranjen iz njihove kopije, se v vseh vrsticah njihove kopije obravnava, kot da ima vrednost null

Združevanje se nadaljuje in ustvari rezultat. Neskladja shem so informativna. Klicatelj mora pred uveljavitvijo preveriti, ali se shema ciljne zbirke podatkov ujema z združenimi podatki.

Dostop do neskladij

Neskladja shem so na voljo v ThreeWayMerge (prek schemaMismatches()) in v MergeResult (prek schemaMismatches() in hasSchemaMismatches()). Ohranjena so skozi 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
}