Shēmas validācija
Ja shēmas starp momentuzņēmumiem attīstās (kolonnas tiek pievienotas, noņemtas vai pārdēvētas), merql nosaka šīs atšķirības un ziņo par tām. Shēmu neatbilstības nebloķē apvienošanu, taču tiek parādītas, lai izsaucējs varētu izlemt, kā rīkoties.
Noteikšana
SchemaValidator::validate() salīdzina katras tabulas kolonnu kopas pamatmomentuzņēmumā, mūsu un viņu momentuzņēmumā. Tas ziņo par:
- Kolonnām, kas pievienotas mūsu momentuzņēmumā (ir tajā, bet nav pamatmomentuzņēmumā)
- Kolonnām, kas noņemtas mūsu momentuzņēmumā (ir pamatmomentuzņēmumā, bet nav mūsu momentuzņēmumā)
- Kolonnām, kas pievienotas viņu momentuzņēmumā
- Kolonnām, kas noņemtas viņu momentuzņēmumā
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 tiek noteikts
| Izmaiņa | Tiek noteikta | Piezīmes |
|---|---|---|
| Pievienota kolonna | Jā | Ziņo par katru pusi (mūsu/viņu) |
| Noņemta kolonna | Jā | Ziņo par katru pusi |
| Mainīts kolonnas tips | Nē | Tipi tiek saglabāti, bet netiek salīdzināti |
| Pārdēvēta kolonna | Nē | Tiek uzrādīta kā pievienošana un noņemšana |
| Mainīta primārā atslēga | Nē | Identitāte tiek fiksēta momentuzņēmuma izveides laikā |
Darbība apvienošanas laikā
Ja kolonna ir vienā momentuzņēmumā, bet tās nav citā, apvienošanā trūkstošās kolonnas vērtība tiek uzskatīta par null. Tas nozīmē:
- Kolonna, kas pievienota viņu momentuzņēmumā ar vērtību, kas nav null, tiek uzskatīta par
null -> value(pieņemta kā viņu izmaiņa) - Kolonna, kas noņemta viņu momentuzņēmumā, tiek uzskatīta par tādu, kurai visās viņu rindās ir
null
Apvienošana turpinās un izveido rezultātu. Shēmu neatbilstības ir informatīvas. Pirms piemērošanas izsaucējam jāpārbauda, vai mērķa datubāzes shēma atbilst apvienotajiem datiem.
Piekļuve neatbilstībām
Shēmu neatbilstības ir pieejamas gan objektā ThreeWayMerge (izmantojot schemaMismatches()), gan objektā MergeResult (izmantojot schemaMismatches() un hasSchemaMismatches()). Tās tiek saglabātas, izmantojot 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
}