Schemos tikrinimas
Kai skirtingose momentinėse kopijose keičiasi schemos (pridedami, pašalinami arba pervadinami stulpeliai), merql aptinka šiuos skirtumus ir apie juos praneša. Schemos neatitikimai nesustabdo sujungimo, tačiau yra parodomi, kad iškvietėjas galėtų nuspręsti, kaip elgtis toliau.
Aptikimas
SchemaValidator::validate() palygina kiekvienos lentelės stulpelių rinkinius base, ours ir theirs momentinėse kopijose. Pranešama apie:
- Pusėje ours pridėtus stulpelius (yra ours, bet nėra base)
- Pusėje ours pašalintus stulpelius (yra base, bet nėra ours)
- Pusėje theirs pridėtus stulpelius
- Pusėje theirs pašalintus stulpelius
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"
}
}
Kas aptinkama
| Pakeitimas | Aptinkama | Pastabos |
|---|---|---|
| Stulpelis pridėtas | Taip | Pateikiama atskirai kiekvienai pusei (ours/theirs) |
| Stulpelis pašalintas | Taip | Pateikiama atskirai kiekvienai pusei |
| Stulpelio tipas pakeistas | Ne | Tipai saugomi, bet nelyginami |
| Stulpelis pervadintas | Ne | Rodomas kaip pridėjimas ir pašalinimas |
| Pirminis raktas pakeistas | Ne | Tapatybė nustatoma fiksuojant momentinę kopiją |
Veikimas sujungimo metu
Jei stulpelis yra vienoje momentinėje kopijoje, bet jo nėra kitoje, sujungimo metu trūkstama stulpelio reikšmė laikoma null. Tai reiškia:
- Jei pusėje theirs pridėtas stulpelis turi ne NULL reikšmę, ji rodoma kaip
null -> value(pakeitimas iš theirs priimtas) - Jei pusėje theirs pašalintas stulpelis, laikoma, kad jo reikšmė visose theirs eilutėse yra
null
Sujungimas tęsiamas ir pateikiamas rezultatas. Schemos neatitikimai yra informacinio pobūdžio. Prieš pritaikydamas sujungtus duomenis, iškvietėjas turėtų patikrinti, ar tikslinės duomenų bazės schema su jais sutampa.
Neatitikimų peržiūra
Schemos neatitikimus galima pasiekti per ThreeWayMerge (naudojant schemaMismatches()) ir per MergeResult (naudojant schemaMismatches() ir hasSchemaMismatches()). Jie išsaugomi per 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
}