web-dev-qa-db-ja.com

CSVファイルからユーザーを移行するときに不明なマップ列

CSVファイルからユーザーをインポートしようとしていますが、インポートは次のエラーで失敗します。

ソースプラグイン例外で移行が失敗しました:SQLSTATE [42S22]:列が見つかりません:1054不明な列 'map.sourceid4'が 'where句'に含まれています(includes/database/database.inc:2171内)

移行クラスは次のとおりです。

<?php

/**
 * @file
 * Class for migrating users from a CSV file.
 */

/**
 * Class FooMigrateUsers.
 */
class FooMigrateUsers extends Migration {


  /**
   * Constructor.
   *
   * @inheritdoc
   */
  public function __construct($arguments) {
    parent::__construct($arguments);
    $this->description = t('Foo users from CSV file');

    // Create the migrate source.
    $import_path = drupal_get_path('module', 'foo_migrate') . '/import/users.csv';
    $options = array(
      'header_rows' => 1,
    );

    $this->source = new MigrateSourceCSV($import_path, array(), $options);
    $this->destination = new MigrateDestinationUser();

    $this->map = new MigrateSQLMap($this->machineName,
        array(
          'Title' => array(
            'type' => 'varchar',
            'length' => 15,
            'not null' => TRUE,
            'description' => 'Title',
          ),
          'Firstname' => array(
            'type' => 'varchar',
            'length' => 35,
            'not null' => TRUE,
            'description' => 'First name',
          ),
          'Lastname' => array(
            'type' => 'varchar',
            'length' => 35,
            'not null' => TRUE,
            'description' => 'Last name',
          ),
          'Primary email address' => array(
            'type' => 'varchar',
            'length' => 80,
            'not null' => TRUE,
            'description' => 'Primary email address',
          ),
        ),
        MigrateDestinationUser::getKeySchema()
        );

    // Mapped fields

    // We must have a unique username in the Drupal 'users' table.
    // dedupe() takes the Drupal table and column for determining uniqueness.
    $this->addFieldMapping('name', 'Primary email address')
         ->dedupe('users', 'name');
    $this->addFieldMapping('mail', 'Primary email address')
         ->dedupe('users', 'mail');

    //$this->addFieldMapping('pass', 'password');

    // Apply default role.
    $this->addFieldMapping('roles')
         ->defaultValue(DRUPAL_AUTHENTICATED_RID);

    $this->addFieldMapping('field_user_first_name',      'Firstname');
    $this->addFieldMapping('field_user_last_name',       'Lastname');

    $this->addUnmigratedSources(array('Title'));

    $this->addUnmigratedDestinations(array(
      'access',
      'created',
      'data',
      'is_new',
      'language',
      'login',
      'pass',
      'picture',
      'role_names',
      'signature',
      'signature_format',
      'theme',
      'timezone',
    ));

  }

  /**
   * Modifies the row to be imported.
   *
   * @inheritdoc
   */
  public function prepareRow($row) {
    return parent::prepareRow($row);
  }

}

CSVデータは次のようになります。

"Title","Firstname","Lastname","Primary email address"
"Mr","Foo","Bar","[email protected]"
"Mrs","Bar","Foo","[email protected]"
1
kenorb

「列が見つかりません」(map.sourceid4)エラーは、ソースマッピングに関連する移行テーブルが完全ではないようです。

テーブルを特定する必要があります(drushコマンドを使用するなど):

drush sqlq "SHOW TABLES LIKE 'migrate_map_%'"

注:引用部分のみを使用して、SQLエディターで上記を実行することもできます。

そして、そのテーブルで利用可能な列のリストを確認します。

$ drush sqlq "DESC migrate_map_foomigrateusers"
sourceid1   varchar(128)    NO  PRI NULL
sourceid2   varchar(128)    NO  PRI NULL
sourceid3   varchar(128)    NO  PRI NULL
destid1 int(10) unsigned    YES     NULL
needs_update    tinyint(3) unsigned NO      0
rollback_action tinyint(3) unsigned NO      0
last_imported   int(10) unsigned    NO      0
hash    varchar(32) YES     NULL

sourceidX列の数は、CSVファイルの列の数と一致する必要があります。そうでない場合は、CSVファイルを変更した可能性があります。構造を変更するたびに、移行クラスを再登録する必要があります(参照:hook_migrate_api)。

したがって、静的に定義された移行クラスを再登録してください(drush ms):

drush migrate-deregister FooMigrateUsers
drush migrate-register FooMigrateUsers

さらに問題が発生した場合は、これらのdrushコマンドも便利です。

drush migrate-mappings --all # To verify mapping.
drush migrate-fields-source --all # To list source field mapping.

準備ができたら、データを再度インポートしてみます。

drush mi FooMigrateUsers
1
kenorb