Validation du schéma
Lorsque les schémas évoluent d’un instantané à l’autre (colonnes ajoutées, supprimées ou renommées), merql détecte et signale ces différences. Les incompatibilités de schéma ne bloquent pas la fusion, mais elles sont signalées afin que l’appelant puisse décider de la marche à suivre.
Détection
SchemaValidator::validate() compare les ensembles de colonnes de chaque table dans les instantanés base, ours et theirs. Il indique :
- Colonnes ajoutées dans ours (présentes dans ours, mais absentes de base)
- Colonnes supprimées dans ours (présentes dans base, mais absentes de ours)
- Colonnes ajoutées dans theirs
- Colonnes supprimées dans 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"
}
}
Éléments détectés
| Modification | Détectée | Remarques |
|---|---|---|
| Colonne ajoutée | Oui | Indiquée pour chaque côté (ours/theirs) |
| Colonne supprimée | Oui | Indiquée pour chaque côté |
| Type de colonne modifié | Non | Les types sont stockés, mais pas comparés |
| Colonne renommée | Non | Apparaît comme un ajout et une suppression |
| Clé primaire modifiée | Non | L'identité est fixée au moment de l'instantané |
Comportement lors de la fusion
Lorsqu'une colonne existe dans un instantané, mais pas dans un autre, la valeur manquante est considérée comme null. Cela signifie que :
- Une colonne ajoutée dans theirs avec une valeur non nulle apparaît comme
null -> value(la modification de theirs est acceptée) - Une colonne supprimée dans theirs est considérée comme ayant
nullpour toutes les lignes de theirs
La fusion se poursuit et produit un résultat. Les différences de schéma sont fournies à titre informatif. L'appelant doit vérifier que le schéma de la base de données cible correspond aux données fusionnées avant de les appliquer.
Accès aux différences
Les différences de schéma sont disponibles à la fois sur ThreeWayMerge (via schemaMismatches()) et sur MergeResult (via schemaMismatches() et hasSchemaMismatches()). Elles sont conservées par 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
}