1

フィード モジュールを使用して既存のデータを Drupal 7 にインポートしていますが、うまく機能しますが、生成される nid に問題が 1 つあります。

これらを既存のサイト ID と一致させたいので、同じ URL を保持したまま、古いものと新しいものの間をきれいに移行できます。

ここには 2 つのアプローチがあります。1. 何らかの方法でこれらの nid をインポートの一部として割り当てます。2. インポート後に nid の番号を付け直します。

Googleでモジュールやその他のコードを見つけることができないので、自分で何かをハックする必要があるようです...以前に誰かがこれを行ったことがありますか?

-

これらすべてを更新するのと同じくらい簡単でしょうか?

SELECT table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name = 'nid'

comment
history
location_instance
node
node_access
node_comment_statistics
node_counter
node_revision
search_node_links
taxonomy_index

編集:そしてこれら...

SELECT table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name = 'entity_id'

feeds_item
field_data_body
field_data_comment_body
field_data_field_address
field_data_field_image
field_data_field_state
field_data_field_tags
field_data_field_type
field_data_field_website
field_revision_body
field_revision_comment_body
field_revision_field_address
field_revision_field_image
field_revision_field_state
field_revision_field_tags
field_revision_field_type
field_revision_field_website
4

2 に答える 2

0

ソースに元の nid が含まれている場合は、フィード インポーターでマッピングを設定して nid を割り当てることができます。この方法では、各ノードに同じ nid が割り当てられるだけなので、インポート プロセスの後にデータベースを操作する必要はありません。

サイトに同じ nid を持つ既存のノードがある場合、これは明らかに壊れる可能性があります。

于 2015-03-27T14:16:50.990 に答える
0

これが私が最終的にやったことです...

すべて正しく動作しているように見えますが、このようなことを行う前に、非常に慎重にバックアップを作成してください (私が行ったように)。

header('Content-type: text/plain');

global $database, $tables, $prefix;
$database = // your database

$prefix = 'drupal_';

$tables = array (
'comment'                 => 'nid',
'history'                 => 'nid',
'location_instance'       => 'nid',
'node'                    => 'nid',
'node_access'             => 'nid',
'node_comment_statistics' => 'nid',
'node_counter'            => 'nid',
'node_revision'           => 'nid',
'search_node_links'       => 'nid',
'taxonomy_index'          => 'nid',
'feeds_item'                   => 'entity_id',
'field_data_body'              => 'entity_id',
'field_data_comment_body'      => 'entity_id',
'field_data_field_address'     => 'entity_id',
'field_data_field_image'       => 'entity_id',
'field_data_field_state'       => 'entity_id',
'field_data_field_tags'        => 'entity_id',
'field_data_field_type'        => 'entity_id',
'field_data_field_website'     => 'entity_id',
'field_revision_body'          => 'entity_id',
'field_revision_comment_body'  => 'entity_id',
'field_revision_field_address' => 'entity_id',
'field_revision_field_image'   => 'entity_id',
'field_revision_field_state'   => 'entity_id',
'field_revision_field_tags'    => 'entity_id',
'field_revision_field_type'    => 'entity_id',
'field_revision_field_website' => 'entity_id'
    );

// Move all nids +10000 (out of the way)

$query = "SELECT nid FROM {$prefix}node WHERE nid < 10000 ORDER BY nid";
echo "$query\n";
$result = $database->query($query);
while($data = $result->fetchRow()) {
    echo "Processing nid: {$data['nid']}\n";
    changeNodeId($data['nid'], $data['nid'] + 10000);
}

// Move all nids to match guids
// (I originally imported through the feeds module, so used the guids to reorder here, but you can use your own logic as required...)

$query = "SELECT guid, entity_id FROM {$prefix}feeds_item WHERE guid <> entity_id ORDER BY ABS(guid)";
echo "$query\n";
$result = $database->query($query);
while($data = $result->fetchRow()) {
    echo "Processing guid: {$data['guid']} (nid: {$data['entity_id']})\n";
    changeNodeId($data['entity_id'], $data['guid']);
}

function changeNodeId($old, $new)
{
    global $database, $tables, $prefix;

    echo "Updating nid: {$old} -> {$new}\n";

    // Check new doesn't already exist
    $query = "SELECT * FROM {$prefix}node WHERE nid={$new}";
    $result = $database->query($query);
    if ($result->fetchRow()) {
        echo "Error nid: {$new} already exists!\n"; 
        return;
    }

    foreach ($tables as $table => $column)
    {
        $query = "UPDATE {$prefix}{$table} SET {$column} = {$new} WHERE {$column} = {$old}";
        echo "$query\n";
        $database->query($query);
    }
}

ノート。

  1. 上記の表は私にとってはうまくいきました。インストールしたモジュールに応じて、ほぼ確実に異なります。

  2. これにより、メニューや設定した URL エイリアスが破損するため、後で手動で修正する必要がありますが、大きな問題ではありません。

  3. また、ノード テーブルで自動インクリメント ID をリセットすることをお勧めします。ALTER TABLE node AUTO_INCREMENT = Xここで、X は最大の nid よりも 1 大きくなります。

于 2013-07-13T05:46:57.347 に答える