我遇到了评论者提出的同一问题:Django South - table already exists
没有后续行动,所以我想我会发一个新问题。我有一个Django应用程序,我在南方管理它的迁移。我在模型中添加了一个字段然后运行
./manage schemamigration my_app --auto
按预期运行。运行
./manage migrate my_app
但是,导致错误,表明与我更改的模型关联的表已经存在。这导致我上面的链接问题,所以运行
./manage migrate my_app --fake
解决了表错误,但现在我收到Django错误,表明与新字段关联的列不存在。
./manage sqlall my_app
显示架构符合预期。
对于如何解决这个问题的任何想法都表示赞赏!
答案 0 :(得分:32)
最简单的方法是从头开始迁移。
删除您尝试修复的应用的所有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
答案 1 :(得分:5)
要注意的其他事项:如果您在DatabaseError: no such column: appname_model.fieldname
关系中使用default
值,并且添加了字段,则通常会出现此错误(ForeignKey
)到那个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)
运行南schemamigration
时会出错:
DatabaseError: no such column: myappmodel_fkmodel.new_field
您可以通过确保初始南迁移包含此默认值lambda
函数来解决此问题,但在下一次迁移中删除默认值。
这在过去一直困扰着我。希望它能帮助将来的某个人。
答案 2 :(得分:0)
对于初学者或学习者,如果你卡在这里并且不介意数据丢失(所有),那么只需删除 db.sqlit3 文件并重新运行服务器,它应该重置 sqlite