Convalida dello schema
Quando gli schemi evolvono tra snapshot (con colonne aggiunte, rimosse o rinominate), merql rileva e segnala queste differenze. Le discrepanze di schema non bloccano la fusione, ma vengono mostrate così che il chiamante possa decidere come procedere.
Rilevamento
SchemaValidator::validate() confronta gli insiemi di colonne di ogni tabella negli snapshot base, ours e theirs. Segnala:
- Colonne aggiunte in ours (presenti in ours ma non in base)
- Colonne rimosse in ours (presenti in base ma non in ours)
- Colonne aggiunte in theirs
- Colonne rimosse in 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"
}
}
Elementi rilevati
| Modifica | Rilevata | Note |
|---|---|---|
| Colonna aggiunta | Sì | Segnalata per lato (ours/theirs) |
| Colonna rimossa | Sì | Segnalata per lato |
| Tipo di colonna modificato | No | I tipi vengono salvati ma non confrontati |
| Colonna rinominata | No | Appare come aggiunta e rimozione |
| Chiave primaria modificata | No | L'identità è fissata al momento dello snapshot |
Comportamento durante la fusione
Quando una colonna è presente in uno snapshot ma non in un altro, la fusione considera il valore della colonna mancante come null. Questo significa che:
- Una colonna aggiunta in theirs con un valore non nullo appare come
null -> value(accettata come modifica di theirs) - Una colonna rimossa in theirs appare come se avesse
nullper tutte le righe in theirs
La fusione prosegue e produce un risultato. Le discrepanze di schema sono informative. Il chiamante dovrebbe verificare che lo schema del database di destinazione corrisponda ai dati risultanti dalla fusione prima di applicarli.
Accesso alle discrepanze
Le discrepanze di schema sono disponibili sia su ThreeWayMerge (tramite schemaMismatches()) sia su MergeResult (tramite schemaMismatches() e hasSchemaMismatches()). Vengono mantenute attraverso 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
}