Quell-Id-Zuordnung einer Migration in Drupal 8 ändern

Geschrieben von patrick am Mi., 13.12.2017 - 07:30 Uhr

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á.

Systeme
Drupal 8/9