2017-12-01 4 views
0

나는 PostgreSQL의 9.6.5 데이터베이스에 장고 1.11 마이그레이션을 실행하기 위해 노력하고있어, 나는 이상한 오류 받고 있어요 :장고없는 : Y가 존재하지 않는 관계의 제약 X를

Applying myapp.0011_auto_20171130_1807...Traceback (most recent call last): 
    File "manage.py", line 9, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/usr/local/myproject/.env/local/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 "/usr/local/myproject/.env/local/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 "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/usr/local/myproject/.env/local/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 "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/operations/models.py", line 536, in database_forwards 
    getattr(new_model._meta, self.option_name, set()), 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 349, in alter_unique_together 
    self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 380, in _delete_composed_index 
    self.execute(self._delete_constraint_sql(sql, model, constraint_names[0])) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 120, in execute 
    cursor.execute(sql, params) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: constraint "idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq" of relation "myapp_mymodel" does not exist 

이전 중 하나의 계약에서 고유 한 계약이 하나의 열에서 두 개의 계약으로 변경되었습니다. 아주 간단합니다. 새 색인을 생성하기 전에 이전 색인 인 "idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq"을 삭제해야합니다. 그러나 오래된 것이 있다고 생각하지 않기 때문에 실패합니다.

그래서 pgAdminIII를 사용하여 데이터베이스에 연결하고 테이블을 검사했으며 오류 메시지와 달리 표에 idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq이라는 색인이 있습니다.

Django가 약간 다른 연결 매개 변수를 사용하고 있고 다른 데이터베이스에 연결되어있을 가능성이 있습니까? Django dbshell 내부에서 검사 해보 죠. 그래서 나는 manage.py dbshell을 시작했고 :

SELECT * 
FROM pg_stat_all_indexes  
WHERE indexrelname='idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq'; 

그리고 그것은 1 행을 돌려 줬다.

인덱스가 데이터베이스에 확실히 존재하더라도 마이그레이션 중에 장고는이 인덱스를 볼 수없는 이유는 무엇입니까?

+1

/myapp/0011_auto_20171130_1807.py의 내용을 표시 할 수 있습니까? – manassehkatz

답변

0

문제는 데이터베이스를 pgloader 도구를 사용하여 MySQL에서 PostgreSQL로 변환 한 것으로 밝혀졌습니다.이 툴은 PostgreSQL에서 색인으로 생성하여 제약 조건을 변환하는 반면 Django PG 백엔드는 제약 조건으로 생성합니다. 따라서 마이 그 레이션이 실행될 때 제약 조건 만 찾고 아무 것도 찾지 못합니다.

나는 인덱스를 삭제하고 함께 진정한 제약 조건으로 다시 만들어이 고정 :

DROP INDEX idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq; 
ALTER TABLE public.myapp_mymodel ADD CONSTRAINT idx_32269_myapp_mymodel_title_333195ae82ac2107_uniq UNIQUE(title); 

그 후, 장고 마이그레이션이 제대로 실행.

관련 문제