Django South - 表已经存在

Ste*_*eve 188 django django-south

我正试图开始南方.我有一个现有的数据库,我添加了South(syncdb,schemamigration --initial).

然后,我更新models.py了添加字段并运行./manage.py schemamigration myapp --auto.它似乎找到了该领域并说我可以应用它./manage.py migrate myapp.但是,这样做会给出错误:

django.db.utils.DatabaseError: table "myapp_tablename" already exists
Run Code Online (Sandbox Code Playgroud)

tablename是第一个列出的表models.py.

我正在运行Django 1.2,South 0.7

Ash*_*hok 310

由于您已经在数据库中创建了表,因此您只需将初始迁移作为伪造运行

./manage.py migrate myapp --fake
Run Code Online (Sandbox Code Playgroud)

确保模型的模式与数据库中的表的模式相同.

  • 我喜欢这么快找到答案 - 非常感谢@Ashok! (3认同)
  • 这对我没有帮助.我已经在我的数据库中有一个表,在伪造迁移后,没有办法添加其他伪造的表.我不得不放弃所有桌子并重新开始. (3认同)

pie*_*zym 41

虽然表"myapp_tablename"已经存在,但在我执行./manage.py迁移myapp --fake之后错误停止提升,DatabaseError显示没有这样的列:myapp_mymodel.added_field.

得到完全相同的问题!

1.首先检查导致此问题的迁移号码.让我们假设它是:0010.

你需要:

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp
Run Code Online (Sandbox Code Playgroud)

如果缺少多个字段,则必须为每个字段重复该字段.

3.现在您需要进行一系列新的迁移,因此请从myapp/migrations中删除他们的文件(0011以及如果您需要添加多个字段).

跑这个:

./manage.py migrate myapp 0010
Run Code Online (Sandbox Code Playgroud)

现在尝试./manage.py迁移myapp

如果它没有失败你就准备好了.如果没有丢失任何字段,只需双重检查.

编辑:

如果您有一个安装了South的生产数据库,并且在其他环境中创建的第一个初始迁移重复了您在db中已有的内容,则也会发生此问题.这里的解决方案更容易:

  1. 假第一次迁移:

    ./manage migrate myapp 0001 --fake

  2. 与剩余的迁移一起滚动:

    ./manage迁移myapp


ben*_*hor 10

当我遇到这个错误时,它有不同的原因.

在我的情况下,南不知何故在我的数据库中留下了一个临时的空表,它在_remake_table()中使用.可能我以一种我不应该拥有的方式中止了迁移.在任何情况下,每次后续的新迁移,当它调用_remake_table()时,都会抛出错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists,因为它确实存在并且不应该存在.

_south_new对我来说很奇怪,所以我浏览了我的DB,看到了桌子_south_new_myapp_mymodel,抓了我的头,看着南方的来源,认定它是垃圾,掉了桌子,一切都很顺利.