migrate https://blog.werk21.de/de de Change source id mapping of a Drupal 8 migration https://blog.werk21.de/en/2017/12/13/change-source-id-mapping-drupal-8-migration <span>Quell-Id-Zuordnung einer Migration in Drupal 8 ändern</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span><time datetime="2017-12-13T07:30:55+01:00" title="Mittwoch, 13. Dezember 2017 - 07:30 Uhr">Mi., 13.12.2017 - 07:30 Uhr</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>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.</p> <p>Vor kurzem arbeitete ich an einer Migration, die das <span class="geshifilter"><code class="php geshifilter-php">Url</code></span> source plugin von <a href="https://drupal.org/project/migrate_plus">Migrate Plus</a> verwendet, um Dateien aus einer <span class="geshifilter"><code class="php geshifilter-php">XML</code></span>-Quelle zu importieren. Die source plugins von Migrate Plus erlauben es, die Ids, die normalerweise von<a href="https://api.drupal.org/api/drupal/core%21modules%21migrate%21src%21Plugin%21MigrateSourceInterface.php/function/MigrateSourceInterface%3A%3AgetIds/8.4.x">MigrateSourceInterface::getIds()</a> zurückgegeben werden, in der <span class="geshifilter"><code class="php geshifilter-php">YML</code></span>-Datei der Migration anzugeben. Ursprünglich verwendete ich eine einfache Id-Zuordnung wie diese:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">source<span style="color: #339933;">:</span> ids<span style="color: #339933;">:</span> id<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> integer</pre></div> <p>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:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"> ids<span style="color: #339933;">:</span> id<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> integer file_name<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> string</pre></div> <p>Soweit so gut. Als ich die Migration aktualisieren wollte, wurde ich von dieser Fehlermeldung begrüßt:</p> <blockquote> <p>Migration failed with source plugin exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column "sourceid2" in<br /> "field list": INSERT INTO {migrate_map_example_file} (source_ids_hash, sourceid1, sourceid2, source_row_status,<br /> rollback_action, hash, last_imported) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2,<br /> :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6); Array<br /> (<br />     [:db_insert_placeholder_0] =&gt; a8d0cbb8ca5f48c73993244fd275342d84b92a2eb33300b0852ef560f70aa55d<br />     [:db_insert_placeholder_1] =&gt; 10817<br />     [:db_insert_placeholder_2] =&gt;<br />     [:db_insert_placeholder_3] =&gt; 2<br />     [:db_insert_placeholder_4] =&gt; 0<br />     [:db_insert_placeholder_5] =&gt;<br />     [:db_insert_placeholder_6] =&gt; 1513082182<br /> )  </p> </blockquote> <p>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:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">DROP TABLE migrate_map_example_file<span style="color: #339933;">;</span></pre></div> <p>Weniger experimentierfreudige Menschen könnten die Tabelle zunächst auch einfach nur umbenennen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><a href="http://www.php.net/rename"><span style="color: #990000;">RENAME</span></a> TABLE migrate_map_example_file TO migrate_map_example_file_backup<span style="color: #339933;">;</span></pre></div> <p>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á.</p> </div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8-9" class="label label-default" hreflang="de">Drupal 8/9</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/migrate" class="label label-default" hreflang="de">migrate</a> <a href="/en/tags/migrateplus" class="label label-default" hreflang="en">migrate_plus</a> <a href="/en/tags/source" class="label label-default" hreflang="en">source</a> <a href="/en/tags/url" class="label label-default" hreflang="en">Url</a> <a href="/en/tags/migratesourceinterface" class="label label-default" hreflang="en">MigrateSourceInterface</a> <a href="/en/tags/getids" class="label label-default" hreflang="en">getIds</a> </div> Wed, 13 Dec 2017 05:57:34 +0000 patrick 128 at https://blog.werk21.de