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