Aller au contenu

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

É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 null pour 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().

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
}