南迁移错误 - 关系已经存在
Posted
技术标签:
【中文标题】南迁移错误 - 关系已经存在【英文标题】:South migrate error - relation already exists 【发布时间】:2013-02-04 19:45:54 【问题描述】:背景: 将 djangoatings 添加到我的项目后,我尝试运行
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
再次。然后我运行了迁移命令。这是我收到错误的时候:
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
然后再次运行--initial,但执行迁移命令后出现同样的错误。
我查看了数据库中的表列表,但没有看到任何 djangoratings_vote。
我当前的 djangoatings 迁移列表如下:
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】:有更好的方法来解决它:
python manage.py migrate djangoratings --fake
然后:
python manage.py migrate
【讨论】:
【参考方案2】:在我看来,South 与您的数据库不同步(如果 south 已开始创建表,但随后失败而无法完成向后迁移,则可能会发生这种情况)。我建议手动恢复数据库和南方如下(先备份你的数据库,以防出错):
-
从您的数据库中删除所有 djangoratings_* 表。
打开数据库中的 south_migrationhistory 表,并按应用名称过滤。删除 djangoatings 的所有条目。
删除 djangoratings/migrations 目录中的所有迁移文件。
完成此操作后,您应该有一个干净的数据库和南方历史。此时,重新运行:
./manage.py schemamigration djangoratings --initial
这将生成一个迁移文件。那么:
./manage.py migrate djangoratings.
假设您没有遇到第一次遇到的错误,这应该设置数据库,以便您准备好使用 django 评级。
【讨论】:
谢谢!我能够毫无问题地执行迁移命令。我在数据库中没有任何 djangoatings 表或 djangoatings 条目,所以我只需要删除我的迁移文件。 我有完全相同的问题,但在一个新创建的数据库上。我尝试删除迁移,擦除数据库并重新安装南,但没有任何改变,关于如何修复它的任何想法? @suburban - 在不了解您的情况的情况下很难确切地告诉您您的问题是什么,但是如果您收到“仍然存在”错误,那么您没有从数据库中删除表,或者(不太可能)其中一个迁移脚本中有错误。我的答案是一年多以前的,从那时起南方发生了很多变化 - 可能值得提出一个新问题。【参考方案3】:这是@stef_huayue 的答案的扩展,如果它没有按预期工作。
找出哪个迁移失败。对应的 migration_file.py 通常是 migrations.AddField
操作发生的地方。然后运行:
python manage.py migrate app_name --fake [migration_file]
没有文件扩展名。其次是:
python manage.py migrate app_name
【讨论】:
以上是关于南迁移错误 - 关系已经存在的主要内容,如果未能解决你的问题,请参考以下文章
陷入 django 南迁移 - TransactionManagement 错误
南迁移错误,InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
ProgrammingError: 关系 'blah blah' 不存在,试图运行特定的迁移并得到错误