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