18

我在这里遇到了评论者提出的相同问题:Django South - table already exists

没有后续行动,所以我想我会发布一个新问题。我有一个 Django 应用程序,我使用 South 管理其迁移。我在模型中添加了一个字段,然后运行

./manage schemamigration my_app --auto

按预期运行。跑步

./manage migrate my_app

但是,导致错误指示与我更改的模型关联的表已存在。这让我想到了上面链接的问题,所以运行

./manage migrate my_app --fake

解决了表错误,但现在我收到一个 Django 错误,即与新字段关联的列不存在。

./manage sqlall my_app

显示架构符合预期。

任何关于如何解决这个问题的想法都值得赞赏!

4

3 回答 3

34

对您来说最简单的方法可能是从头开始迁移。

删除migrations/*您尝试修复的应用程序的所有文件。将您的数据库恢复models.py到当前的状态(借助版本控制工具,或者只是注释掉新字段)。然后初始化迁移:

manage.py migrate my_app --delete-ghost-migrations
manage.py schemamigration my_app --init
manage.py migrate my_app --fake

这将在迁移中创建当前数据库结构的记录。

现在将您的更改添加到models.py南部,现在将发生更改:

manage.py schemamigration my_app --auto
manage.py migrate my_app
于 2010-11-07T18:53:55.573 回答
6

其他需要注意的事情:DatabaseError: no such column: appname_model.fieldname如果您在关系中使用defaultForeignKey,并且向该 FK 模型添加一个字段,您通常会收到此错误 ( )。

像(在你的models.py)这样的东西:

class MyAppModel(models.Model):
    my_foreign_key = models.ForeignKey(FkModel,
                                       default=lambda: FkModel.objects.get(id=1),
                                       null=True)

然后在新的迁移中,向 FkModel 添加一个新字段:

class FkModel(models.Model):
    new_field = models.IntegerField('New Field Name', blank=True, null=True)

运行 South 时会出现错误schemamigration

DatabaseError: no such column: myappmodel_fkmodel.new_field

您可以通过确保您的初始南迁移包含此默认值lambda函数来解决此问题,然后在下一次迁移中删除默认值。

这在过去一直困扰着我。希望它会在未来对某人有所帮助。

于 2013-08-21T18:29:53.293 回答
0

对于初学者或学习者,如果您卡在这里并且不介意数据丢失(全部),那么只需删除 db.sqlit3 文件并重新运行服务器它应该重置 sqlite

于 2021-05-10T13:19:53.700 回答