2017-02-09 21 views
2

約束,同時從鶺鴒1.7運行遷移到1.8,我發現了以下遷移錯誤:wagtailimages.0016 ...遷移錯誤:發現錯誤的數字(0),wagtailimages_rendition

Applying wagtailimages.0016_deprecate_rendition_filter_relation...Traceback (most recent call last): 
    File "djangoware/manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/core/management/__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/core/management/base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/core/management/base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-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 "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-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 "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/migrations/migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/migrations/operations/models.py", line 532, in database_forwards 
    getattr(new_model._meta, self.option_name, set()), 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 329, in alter_unique_together 
    self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/backends/mysql/schema.py", line 83, in _delete_composed_index 
    return super(DatabaseSchemaEditor, self)._delete_composed_index(model, fields, *args) 
    File "/Users/nicklo/.virtualenvs/theproject/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 358, in _delete_composed_index 
    ", ".join(columns), 
ValueError: Found wrong number (0) of constraints for wagtailimages_rendition(image_id, filter_id, focal_point_key) 

這是非常有可能這不是一個乾淨的遷移,因爲雖然試圖從1.6.1逐步升級到1.6.3到1.7,然後到1.8第三方應用程序安裝試圖跳轉到1.8,所以我不得不嘗試清理遷移然後再試一次。

我很高興嘗試通過SQL手動修復此問題,如果需要的話。在wagtailimages_rendition表的當前狀態爲:

CREATE TABLE `wagtailimages_rendition` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `file` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `width` int(11) NOT NULL, 
    `height` int(11) NOT NULL, 
    `filter_id` int(11) DEFAULT NULL, 
    `image_id` int(11) NOT NULL, 
    `focal_point_key` varchar(17) COLLATE utf8_unicode_ci NOT NULL, 
    `filter_spec2` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
    `filter_spec` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `wagtailimages_rendition_f33175e6` (`image_id`), 
    KEY `wagtailimages_rendition_0a317463` (`filter_id`), 
    KEY `wagtailimages_rendition_58c64917` (`filter_spec`) 
) ENGINE=InnoDB AUTO_INCREMENT=352 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

而且我注意到我對鶺鴒1.8運行的另一個項目有以下幾點:

CREATE TABLE `wagtailimages_rendition` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `file` varchar(100) NOT NULL, 
    `width` int(11) NOT NULL, 
    `height` int(11) NOT NULL, 
    `focal_point_key` varchar(255) NOT NULL, 
    `filter_id` int(11) DEFAULT NULL, 
    `image_id` int(11) NOT NULL, 
    `filter_spec` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `wagtailimages_rendition_image_id_323c8fe0_uniq` (`image_id`,`filter_spec`,`focal_point_key`), 
    KEY `wagtailimages_rend_filter_id_7fc52567_fk_wagtailimages_filter_id` (`filter_id`), 
    KEY `wagtailimages_rendition_58c64917` (`filter_spec`), 
    KEY `wagtailimages_rendition_f33175e6` (`image_id`), 
    CONSTRAINT `wagtailimages_rend_filter_id_7fc52567_fk_wagtailimages_filter_id` FOREIGN KEY (`filter_id`) REFERENCES `wagtailimages_filter` (`id`), 
    CONSTRAINT `wagtailimages_rendit_image_id_3e1fd774_fk_wagtailimages_image_id` FOREIGN KEY (`image_id`) REFERENCES `wagtailimages_image` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=272 DEFAULT CHARSET=utf8; 

幫助表示該限制條件的改變,我需要通過SQL做會可能足以解決問題,但任何建議表示讚賞。

回答

1

我最好的猜測是,你在鶺鴒1.8受此漏洞:https://github.com/wagtail/wagtail/issues/3256

這將造成移民0016通過操作失敗的部分路:

migrations.AlterUniqueTogether(
     name='rendition', 
     unique_together=set([('image', 'filter_spec', 'focal_point_key')]), 
    ), 

涉及丟棄(image_id,filter_id,focal_point_key)上的唯一約束,並在(image_id,filter_spec,focal_point_key)上創建一個新的約束。後者失敗是因爲它在某些配置上超過了MySQL的長度限制。

要修復它,確保你已安裝W 1.8 1.8.1(它看起來像你有,因爲它已成功地將focal_point_key的長度減少到17個字符)。然後,將數據庫狀態恢復到正確的狀態遷移0016之前,運行:

ALTER TABLE wagtailimages_rendition ADD UNIQUE KEY wagtailimages_rendition_image_id_uniq (image_id, filter_id, focal_point_key); 

現在manage.py migrate應該有希望完成剩餘的遷移。

+0

我還沒有測試你的答案爲了保持項目的進度,我欺騙了並通過SQL重新創建了工作W project項目中的表,然後僞造了0016_deprecate_rendition_filter_relation,但它聽起來完全像我遇到的問題,米標記爲答案。非常感謝您的反饋。 – nicklo