Vai al contenuto

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

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

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
}