Skeeman kelpoisuuden tarkistus
Kun skeemat muuttuvat tilannevedosten välillä (sarakkeita lisätään, poistetaan tai nimetään uudelleen), merql havaitsee ja raportoi erot. Skeemavirheet eivät estä yhdistämistä, mutta ne tuodaan esiin, jotta kutsuja voi päättää, miten toimia.
Havaitseminen
SchemaValidator::validate() vertaa kunkin taulun sarakejoukkoja base-, ours- ja theirs-tilannevedoksissa. Se raportoi:
- Ours-tilanteeseen lisätyt sarakkeet (ovat ours-tilanteessa mutta eivät basessa)
- Ours-tilanteesta poistetut sarakkeet (ovat basessa mutta eivät ours-tilanteessa)
- Theirs-tilanteeseen lisätyt sarakkeet
- Theirs-tilanteesta poistetut sarakkeet
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"
}
}
Mitä havaitaan
| Muutos | Havaitaan | Huomautukset |
|---|---|---|
| Sarake lisätty | Kyllä | Raportoidaan puolen mukaan (ours/theirs) |
| Sarake poistettu | Kyllä | Raportoidaan puolen mukaan |
| Sarakkeen tyyppi muuttunut | Ei | Tyypit tallennetaan, mutta niitä ei verrata |
| Sarake nimetty uudelleen | Ei | Näkyy lisäyksenä ja poistona |
| Pääavain muuttunut | Ei | Identiteetti määräytyy tilannevedoksen tallennushetkellä |
Toiminta yhdistämisen aikana
Jos sarake on yhdessä tilannevedoksessa mutta puuttuu toisesta, yhdistäminen käsittelee puuttuvan sarakearvon arvona null. Tämä tarkoittaa seuraavaa:
- Theirs-tilanteeseen lisätty sarake, jonka arvo ei ole null, näkyy arvona
null -> value(hyväksytty theirs-muutos) - Theirs-tilanteesta poistettu sarake näkyy siten, että sen arvo on
nullkaikilla theirs-tilanteen riveillä
Yhdistäminen jatkuu ja tuottaa tuloksen. Skeemaerot ovat tiedoksi. Kutsujan tulee varmistaa, että kohdetietokannan skeema vastaa yhdistettyjä tietoja ennen niiden käyttöönottoa.
Erojen tarkastelu
Skeemaerot ovat saatavilla sekä kohteessa ThreeWayMerge (metodin schemaMismatches() kautta) että kohteessa MergeResult (metodien schemaMismatches() ja hasSchemaMismatches() kautta). Ne säilyvät kohteen ConflictResolver::resolve() läpi.
// 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
}