Zum Inhalt springen

Schema-Validierung

Wenn sich Schemas zwischen Snapshots weiterentwickeln (Spalten hinzugefügt, entfernt oder umbenannt werden), erkennt merql diese Unterschiede und meldet sie. Schemaabweichungen verhindern den Merge nicht, werden aber angezeigt, damit der Aufrufer entscheiden kann, wie er vorgeht.

Erkennung

SchemaValidator::validate() vergleicht die Spaltenmengen jeder Tabelle in den Snapshots von Basis, uns und ihnen. Gemeldet werden:

  • Bei uns hinzugefügte Spalten (in unserem Snapshot, aber nicht in der Basis vorhanden)
  • Bei uns entfernte Spalten (in der Basis vorhanden, aber nicht in unserem Snapshot)
  • Bei ihnen hinzugefügte Spalten
  • Bei ihnen entfernte Spalten
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"
    }
}

Erkannte Änderungen

Änderung Erkannt Hinweise
Spalte hinzugefügt Ja Wird pro Seite gemeldet (uns/sie)
Spalte entfernt Ja Wird pro Seite gemeldet
Spaltentyp geändert Nein Typen werden gespeichert, aber nicht verglichen
Spalte umbenannt Nein Erscheint als Hinzufügen und Entfernen
Primärschlüssel geändert Nein Identität wird beim Erstellen des Snapshots festgelegt

Verhalten beim Merge

Wenn eine Spalte in einem Snapshot vorhanden ist, in einem anderen jedoch nicht, behandelt der Merge den fehlenden Spaltenwert als null. Das bedeutet:

  • Eine bei ihnen hinzugefügte Spalte mit einem Wert ungleich null erscheint als null -> value (wird als ihre Änderung übernommen)
  • Eine bei ihnen entfernte Spalte gilt für alle Zeilen in ihrem Snapshot als mit null versehen

Der Merge wird ausgeführt und liefert ein Ergebnis. Schemaabweichungen dienen nur zur Information. Der Aufrufer sollte vor der Anwendung prüfen, ob das Schema der Zieldatenbank zu den zusammengeführten Daten passt.

Abweichungen abrufen

Schemaabweichungen sind sowohl in ThreeWayMerge (über schemaMismatches()) als auch in MergeResult (über schemaMismatches() und hasSchemaMismatches()) verfügbar. Sie bleiben über ConflictResolver::resolve() hinweg erhalten.

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
}