web-dev-qa-db-ja.com

Drupal 6.37からDrupal 7.41にアップグレードするときのデータベースエラー

サイトをDrupal 6.21から6.37に更新しましたが、正常に機能しました。現在、サイトをDrupal 7.41にアップグレードしようとしています。コアを次のように変更しました。アップグレードの手順に従いますが、データベースエラーが表示され、修正方法がわかりません。グーグルで検索したところ、フィールドサイズを手動で増やすように求めるスレッドはほとんどありませんでした https: //www.drupal.org/node/1133024 しかし、あまり役に立たず、同じエラーが再び表示されます。

enter image description here

このエラーを修正するにはどうすればよいですか?

1
TBI Infotech

見出し##この投稿は数日前のものだと思います。まだご覧になっていることを願っています。

何が起こっているのかというと、アップデートはシステムテーブルのタイプフィールドを「再形成」しようとしており、D7では次のようになっています。

type | character varying(12) | not null default ''::character varyingただし、D6ではフィールドは次のようになりました。

type | character varying(255) | not null default ''::character varyin g

これで、そのフィールドに12より長く、切り捨てられる古いコンテンツがあるため、ALTERTABLEコマンドは失敗します。さて、これは私がめちゃくちゃな更新システムと呼ぶものです。

これを修正するにはいくつかのオプションがあると思います。

まず、システムテーブルのバックアップを作成します。

次に、drupalデータベースへのデータベース接続を開き、最長のエントリが何であるかを確認します。Postgresを使用していると想定しています。

select (length(type)), type from system group by type; length | type --------+-------- 5 | theme 6 | module

これが私の出力です。これで、12文字より長いエントリを確認し、有用なデータが含まれているかどうかを確認できます。

さて、最も簡単な方法は、おそらく自分でフィールドの切り捨てを行うことです。

ALTER TABLE system ALTER COLUMN type TYPE VARCHAR(12) USING SUBSTR(type, 1, 12)

次に、移行を再試行します。これがうまくいかない場合でも、バックアップはあります。

2番目のオプションは、これらの定義されたタイプが必要かどうかによって異なります。おそらく、単に削除することができます。

select type from system where length(type) > 12;必要に応じて、これを削除ステートメントに変換します。

フィールドサイズが12であることに依存するコードがない場合は、3番目のオプションが可能です。

Db updateのコードは、modules/system /system.installの2112行目にあります。

function system_update_7018() {
  db_drop_index('system', 'modules');
  db_drop_index('system', 'type_name');
  db_change_field('system', 'type', 'type', array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''));
  db_add_index('system', 'type_name', array('type', 'name'));
}

長さ=> 12を目的の最大長に変更し、dbupdateを再実行します。

それぞれのアプローチがどのような結果をもたらすかはわかりません。また、それぞれがフォローアップエラーを引き起こしたり、他のものを壊したりする可能性があるため、すべて試してみてください。

ヒント:更新にはdrushを使用します。繰り返しのタスクがたくさんあります、roll-back-update-roll-back-update。

1
Michael