Drupals Migrate API hält eine interne Tabelle, in der eindeutige Quell-Ids den Ziel-Ids zugeordnet werden. In der Regel passiert das mittels einer Datenbank-Tabelle, in der jew. die Feldwerte, die eine Quell-Zeile eindeutig identifizieren, und die zugehörige Id der Ziel-Entität im Drupal gespeichert sind. Die Feldnamen und -typen, die eine Quell-Zeile eindeutig identifizieren, werden vom Quell-Plugin der Migration zur Verfügung gestellt. Meistens ist das nur irgendeine Id-Spalte, aber Migrate unterstützt auch quasi beliebige Primärschlüssel mit mehreren Spalten für die Quell-Zeilen.
Vor kurzem arbeitete ich an einer Migration, die das Url
source plugin von Migrate Plus verwendet, um Dateien aus einer XML
-Quelle zu importieren. Die source plugins von Migrate Plus erlauben es, die Ids, die normalerweise vonMigrateSourceInterface::getIds() zurückgegeben werden, in der YML
-Datei der Migration anzugeben. Ursprünglich verwendete ich eine einfache Id-Zuordnung wie diese:
source: ids: id: type: integer
Später stelle ich fest, dass ich auch noch den Dateinamen ergänzen musste, damit die Zuordnung korrekt funktioniert. Meine Id-Zuordnung sah nun so aus:
ids: id: type: integer file_name: type: string
Soweit so gut. Als ich die Migration aktualisieren wollte, wurde ich von dieser Fehlermeldung begrüßt:
Migration failed with source plugin exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column "sourceid2" in
"field list": INSERT INTO {migrate_map_example_file} (source_ids_hash, sourceid1, sourceid2, source_row_status,
rollback_action, hash, last_imported) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2,
:db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6); Array
(
[:db_insert_placeholder_0] => a8d0cbb8ca5f48c73993244fd275342d84b92a2eb33300b0852ef560f70aa55d
[:db_insert_placeholder_1] => 10817
[:db_insert_placeholder_2] =>
[:db_insert_placeholder_3] => 2
[:db_insert_placeholder_4] => 0
[:db_insert_placeholder_5] =>
[:db_insert_placeholder_6] => 1513082182
)
Die Lösung für dieses Problem war tatsächlich wesentlich einfacher als ich zuerst angenommen hatte. Man löscht einfach die Mapping-Tabelle für die passende Migration aus der Drupal-Datenbank:
DROP TABLE migrate_map_example_file;
Weniger experimentierfreudige Menschen könnten die Tabelle zunächst auch einfach nur umbenennen:
RENAME TABLE migrate_map_example_file TO migrate_map_example_file_backup;
Sobald die Migration dann das nächste mal ausgeführt wird, legt Migrate einfach eine passende neue Tabelle an. Diesmal mit den neuen Spalten. Voilá.