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]"
「列が見つかりません」(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