南迁移错误 - 关系已经存在

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' 不存在,试图运行特定的迁移并得到错误

Flyway:关系“flyway_schema_history”已经存在

Django迁移错误表已经存在

南迁移 DateField 到 IntegerField