Pāriet uz saturu

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ā
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"
    }
}

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

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
}