Ошибка миграции юга - отношение уже существует
Фон:
Добавив djangoratings к моему проекту, я попытался запустить
django-admin.py schemamigration djangoratings --initial
--settings=myapp.settings.local
что привело к неизвестной ошибке команды для схемы.
Я попытался разрешить эту ошибку, добавив мою директорию проекта в PYTHONPATH (я использую virtualenv и virtualenvwrapper).
Это разрешило неизвестную командную ошибку для schemamigration, но я думаю, что я указал один каталог выше моего каталога проектов для PYTHONPATH, и когда начальная миграция была запущена для djangoratings, он жаловался на что-то связанное с whoosh (которое я использую в своем проекте), Я изменил каталог PYTHONPATH и попытался запустить
django-admin.py schemamigration djangoratings --initial
--settings=myapp.settings.local
снова. Затем я запустил команду migrate. Это когда я получил ошибку:
django.db.utils.DatabaseError: relation "djangoratings_vote" already exists
Я попробовал мигрировать полностью назад, используя:
django-admin.py migrate djangoratings zero --settings=myapp.settings.local
Running migrations for djangoratings:
- Migrating backwards to zero state.
< djangoratings:0006_add_cookies
< djangoratings:0005_add_exclusions
< djangoratings:0004_rethink_recommendations
< djangoratings:0003_add_correlations
< djangoratings:0002_add_mean_and_stddev
< djangoratings:0001_initial
а затем снова запустить - инициализировать, но такая же ошибка возникла после выполнения команды migrate.
Я просмотрел список таблиц в моей базе данных и не видел ни одного для djangoratings_vote.
Мой текущий список миграции для djangoratings выглядит следующим образом:
0001_initial.py 0006_add_cookies.py
0001_initial.pyc 0006_add_cookies.pyc
0002_add_mean_and_stddev.py 0007_initial.py
0002_add_mean_and_stddev.pyc 0007_initial.pyc
0003_add_correlations.py 0008_initial.py
0003_add_correlations.pyc 0008_initial.pyc
0004_rethink_recommendations.py 0009_initial.py
0004_rethink_recommendations.pyc 0009_initial.pyc
0005_add_exclusions.py __init__.py
0005_add_exclusions.pyc __init__.pyc
Как я могу разрешить отношение "djangoratings_vote" уже существует ошибка? Предпочтительно использовать Юг?
Ответы
Ответ 1
Мне кажется, что Юг не синхронизирован с вашей базой данных (это может произойти, если юг начал создавать таблицы, но затем не удается завершить обратную миграцию). Я бы рекомендовал вручную восстановить базу данных и юг следующим образом (сначала возьмите резервную копию своего db в случае ошибки):
- Удалите все таблицы djangoratings_ * из вашей базы данных.
- Откройте таблицу south_migrationhistory в базе данных и отфильтруйте по имени приложения. Удалите все записи для djangoratings.
- Удалите все файлы миграции в каталоге djangoratings/migrations.
Как только вы это сделаете, у вас должна быть чистая база данных и южная история. На этом этапе запустите:
./manage.py schemamigration djangoratings --initial
Будет создан один файл миграции. Тогда:
./manage.py migrate djangoratings.
Предполагая, что вы не получили ошибки, которые у вас были в первый раз, это должно настроить базу данных, чтобы вы были готовы использовать рейтинги django.
Ответ 2
есть лучший способ его решить:
python manage.py migrate djangoratings --fake
а затем:
python manage.py migrate
Ответ 3
Это расширение ответа @stef_huayue, если оно не работает должным образом.
Узнайте, какая миграция завершилась неудачей. Соответствующий файл migration_file.py обычно будет находиться там, где выполняется операция migrations.AddField
. Затем выполните:
python manage.py migrate app_name --fake [migration_file]
без расширения файла. Далее следуют:
python manage.py migrate app_name