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

时间:2013-02-19 22:53:10

标签: django migration django-south

背景: 将djangoratings添加到我的项目后,我尝试运行

django-admin.py schemamigration djangoratings --initial 
--settings=myapp.settings.local 

导致schemamigration的未知命令错误。 我试图通过将我的项目目录添加到PYTHONPATH来解决此错误(我使用的是virtualenv和virtualenvwrapper)。 这解决了schemamigration未知命令错误,但我想我指定一个目录上面的PYTHONPATH我的项目目录,并在初始迁移为djangoratings运行,它抱怨是与嗖(我用我的项目) 。我更改了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

然后再次运行--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”已经存在错误?最好用南?

3 个答案:

答案 0 :(得分:24)

有一种更好的解决方法:

python manage.py migrate djangoratings --fake

然后:

python manage.py migrate

答案 1 :(得分:13)

听起来好像South与您的数据库不同步(如果南方已经开始创建表格,但是在没有完成向后迁移的情况下失败,则会发生这种情况)。我建议手动恢复数据库和南,如下所示(如果出现错误,请先备份数据库):

  1. 从数据库中删除所有djangoratings_ *表。
  2. 打开数据库中的south_migrationhistory表,并按应用名称进行过滤。删除djangoratings的所有条目。
  3. 删除djangoratings / migrations目录中的所有迁移文件。
  4. 完成此操作后,您应该拥有一个干净的数据库和南方历史记录。此时,重新运行:

    ./manage.py schemamigration djangoratings --initial
    

    这将生成一个迁移文件。然后:

    ./manage.py migrate djangoratings.
    

    假设您没有收到第一次出现的错误,这应该设置数据库,以便您可以使用django评级。

答案 2 :(得分:1)

这是@ stef_huayue的答案的延伸,如果它没有按预期工作。

找出哪些迁移失败。 coressponding migration_file.py通常是.main-content操作发生的地方。然后运行: migrations.AddField

没有文件扩展名。其次是:

python manage.py migrate app_name --fake [migration_file]

相关问题