2017-02-21 9 views
1

Wagtailを1.7から1.8.1にアップグレードしようとしていますが、移行の実行中に次のエラーが発生しています。私たちはPostgres DBを使用しています。ここでWagtail 1.8.1移行の問題

Applying wagtailimages.0016_deprecate_rendition_filter_relation...Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 204, in database_forwards 
    schema_editor.alter_field(from_model, from_field, to_field) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 495, in alter_field 
    old_db_params, new_db_params, strict) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql/schema.py", line 117, in _alter_field 
    new_db_params, strict, 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 649, in _alter_field 
    params, 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 112, in execute 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.IntegrityError: could not create unique index "wagtailimages_rendition_image_id_742f4fe4119535f1_uniq" 
DETAIL: Key (image_id, filter_id, focal_point_key)=(507, 4, 2617-1240-3472x35) is duplicated. 

psqlのコマンドからの出力

Table "public.wagtailimages_rendition" 
    Column  |   Type   |        Modifiers 
-----------------+------------------------+-------------------------- -------------------------------------------- 
id    | integer    | not null default nextval('wagtailimages_rendition_id_seq'::regclass) 
filter_id  | integer    | 
file   | character varying(100) | not null 
width   | integer    | not null 
height   | integer    | not null 
image_id  | integer    | not null 
focal_point_key | character varying(255) | not null 
filter_spec  | character varying(255) | not null 
Indexes: 
    "wagtailimages_rendition_pkey" PRIMARY KEY, btree (id) 
    "wagtailimages_rendition_image_id_323c8fe0_uniq" UNIQUE CONSTRAINT, btree (image_id, filter_spec, focal_point_key) 
    "wagtailimages_rendition_58c64917" btree (filter_spec) 
    "wagtailimages_rendition_filter_id" btree (filter_id) 
    "wagtailimages_rendition_filter_spec_1cba3201_like" btree (filter_spec varchar_pattern_ops) 
    "wagtailimages_rendition_image_id" btree (image_id) 
Foreign-key constraints: 

は、SQLインポートからのエラーはpsqlのあるさ:foxtail.sql:68823:

ERROR: constraint "wagtailcore__content_type_id_c28424df_fk_django_content_type_id" for relation "wagtailcore_page" already exists 
psql:foxtail.sql:68831: ERROR: constraint "wagtailcore_collection_id_5423575a_fk_wagtailcore_collection_id" for relation "wagtailcore_groupcollectionpermission" already exists 
ALTER TABLE 
psql:foxtail.sql:68847: ERROR: constraint "wagtailcore_groupc_permission_id_1b626275_fk_auth_permission_id" for relation "wagtailcore_groupcollectionpermission" already exists 
psql:foxtail.sql:68855: ERROR: constraint "wagtailcore_groupcollectionp_group_id_05d61460_fk_auth_group_id" for relation "wagtailcore_groupcollectionpermission" already exists 
ALTER TABLE 
ALTER TABLE 
ALTER TABLE 
ALTER TABLE 
ALTER TABLE 
psql:foxtail.sql:68903: ERROR: constraint "wagtaildocs_collection_id_23881625_fk_wagtailcore_collection_id" for relation "wagtaildocs_document" already exists 
psql:foxtail.sql:68911: ERROR: constraint "wagtaildocs_docume_uploaded_by_user_id_17258b41_fk_auth_user_id" for relation "wagtaildocs_document" already exists 
ALTER TABLE 
psql:foxtail.sql:68927: ERROR: constraint "wagtailimag_collection_id_c2f8af7e_fk_wagtailcore_collection_id" for relation "wagtailimages_image" already exists 

出力新鮮なインポートの後で実行する前に、移行

Table "public.wagtailimages_rendition" 
Column  |   Type   |         Modifiers 
-----------------+------------------------+-------------------------- -------------------------------------------- 
id    | integer    | not null default nextval('wagtailimages_rendition_id_seq'::regclass) 
filter_id  | integer    | not null 
file   | character varying(100) | not null 
width   | integer    | not null 
height   | integer    | not null 
image_id  | integer    | not null 
focal_point_key | character varying(255) | not null 
Indexes: 
"wagtailimages_rendition_pkey" PRIMARY KEY, btree (id) 
"wagtailimages_rendition_image_id_742f4fe4119535f1_uniq" UNIQUE CONSTRAINT, btree (image_id, filter_id, focal_point_key) 
"wagtailimages_rendition_filter_id" btree (filter_id) 
"wagtailimages_rendition_image_id" btree (image_id) 
Foreign-key constraints: 
"filter_id_refs_id_6909da8c" FOREIGN KEY (filter_id) REFERENCES wagtailimages_filter(id) DEFERRABLE INITIALLY DEFERRED 
"image_id_refs_id_e221c01d" FOREIGN KEY (image_id) REFERENCES wagtailimages_image(id) DEFERRA: 
+0

問題のマイグレーションは、それを作成しないで不快なユニークなインデックスを削除することになっているので、私は少し間違います。Postgresqlのコマンドラインで '\ d wagtailimages_rendition'を実行して、ここに出力するので、データベーステーブルが現在どの状態にあるのか確認できます。 – gasman

+0

ローカルの開発者用にドッカーを使用していますが、コンテナを削除してからもう一度試してみましたが、移行は正常に実行されました。私はいくつかのデータを使用してdbにデータを取り込むためにいくつかのSQLをインポートしようとしましたが、エラーが発生し、私の管理者のすべてがあなたのwagtailサイトページのデフォルトの歓迎です。それは、ユーザーなどをインポートしていますが、それは既にそこにデータがある場合、移行が失敗するようです。 – joss

+0

SQLインポートファイルにスキーマ変更/作成コマンドがいくつか含まれているようですが、特定の初期データベース状態からの起動に依存しているため、移行ではうまくいかないでしょう。私はそれが空のデータベースから実行されることを意図していると思います - それはエラーなしで完了しますか?もしそうなら、その後Wagtail 1.8.1の移行を実行するとどうなりますか? – gasman

答えて

1

私はこのような状況が生じているかを理解することができないので、私は唯一の「核オプション」を提案することができます:PostgreSQLのコマンドラインで

DELETE FROM wagtailimages_rendition; 

を実行することにより、wagtailimages_renditionテーブルの内容を削除します。これにより、残りの移行がエラーなしで完了できるようになります。 Wagtailはレンディションを必要に応じて再生成するため、データの永続的な損失はありません。ただし、レンディションエントリがない各イメージを再レンダリングする必要があるため、ページ要求は遅くなります。

UPDATE:むしろ、すべてを削除するよりも、より保守的なアプローチは、重複するレコードを検索し、削除することです:

DELETE FROM wagtailimages_rendition 
WHERE image_id || '-' || filter_id || '-' || focal_point_key IN (
    SELECT image_id || '-' || filter_id || '-' || focal_point_key 
    FROM (
     SELECT image_id, filter_id, focal_point_key, COUNT(*) AS count 
     FROM wagtailimages_rendition GROUP BY image_id, filter_id, focal_point_key 
    ) AS renditions 
    WHERE count > 1 
); 
+0

ありがとうございました。 – joss

+0

私たちはレンディションテーブルをヌークにしているのかどうかはわかりません。パフォーマンスだけではなく、外部システムがwagtailを呼び出してdjangoテンプレートの外で使用されるサイズ設定の画像を生成するため、同じ方法でページ上で使用されているイメージがあります。 (それが意味をなさないのでしょうか?)私はKarlがこの問題で間もなく投稿したSQLのこのビットを発見しました。これは重複したレンディションを削除するhttps://github.com/wagtail/wagtail/issues/685です。私はそれをローカルで試してみて、移行を進めることができます。これがオプションになると思いますか?ありがとうJoss – joss

+0

@ジョスはい、それは動作するはずです。私はKarlのSQLを変更して、一意性の基準に 'focal_point_key'を含めて現在のスキーマを最新のものにする必要があると思います - 私は(未テストの)固定SQLを含むように答えを更新しました。 – gasman

0

私はジョスは、こちら側に見ているものを確認することができます。

私は何らかの理由で他の人よりも長いfocal_point_key値を持っていると推測しています。そうしないと、移行時に誰もがこの問題を見ているでしょう。

これは過去に私たちのために行ってきたカスタム作業のおかげですか?

解決策が今ここにあるかどうかわかりませんが、何か助けていただければ幸いです。