Validering av schema
När scheman förändras mellan ögonblicksbilder (kolumner läggs till, tas bort eller byter namn) upptäcker merql skillnaderna och rapporterar dem. Schemaavvikelser blockerar inte sammanslagningen, men de visas så att anroparen kan avgöra hur den ska gå vidare.
Identifiering
SchemaValidator::validate() jämför kolumnuppsättningarna för varje tabell i ögonblicksbilderna base, ours och theirs. Den rapporterar:
- Kolumner som lagts till i ours (finns i ours men inte i base)
- Kolumner som tagits bort i ours (finns i base men inte i ours)
- Kolumner som lagts till i theirs
- Kolumner som tagits bort i theirs
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"
}
}
Vad som identifieras
| Ändring | Identifieras | Anteckningar |
|---|---|---|
| Kolumn tillagd | Ja | Rapporteras per sida (ours/theirs) |
| Kolumn borttagen | Ja | Rapporteras per sida |
| Kolumntyp ändrad | Nej | Typer lagras men jämförs inte |
| Kolumn har bytt namn | Nej | Visas som tillägg + borttagning |
| Primärnyckel ändrad | Nej | Identiteten fastställs när ögonblicksbilden skapas |
Beteende vid sammanslagning
När en kolumn finns i en ögonblicksbild men saknas i en annan behandlar sammanslagningen det saknade kolumnvärdet som null. Det innebär att:
- En kolumn som lagts till i theirs med ett värde som inte är null visas som
null -> value(accepteras som deras ändring) - En kolumn som tagits bort i theirs visas som om den hade
nullför alla rader i theirs
Sammanslagningen fortsätter och ger ett resultat. Schemaavvikelserna är endast informativa. Anroparen bör kontrollera att måldatabasens schema överensstämmer med de sammanslagna uppgifterna innan de tillämpas.
Åtkomst till avvikelser
Schemaavvikelser finns både på ThreeWayMerge (via schemaMismatches()) och på MergeResult (via schemaMismatches() och hasSchemaMismatches()). De bevaras genom 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
}