Django 迁移损坏,不会忘记已删除的列
Posted
技术标签:
【中文标题】Django 迁移损坏,不会忘记已删除的列【英文标题】:Django migrate broken, won't forget a deleted column 【发布时间】:2015-12-24 23:38:49 【问题描述】:使用 django 1.7.5,我通过添加字段对 User_Profile 进行了更改:
school = models.CharField(max_length = 255, blank=True, default="")
那么,
$ python manage.py makemigrations
没问题。它添加了该字段。接下来,
$ python manage.py migrate
给我:
django.db.utils.IntegrityError: mathbreakers_userprofile__new.school may not be NULL
哦哦。好吧,在通过设置字段default=""
或blank=True
尝试不同的事情之后,没有任何效果。算了,我删除了该字段并将模型恢复到一切正常时的状态。模型看起来像以前一样,我运行 makemigrations,它删除了该字段(它说)。太好了!
然而,
$ python manage.py migrate
仍然导致相同的错误,抱怨我添加然后删除的字段。好像我不能让 django 忘记那个字段的存在。但它在我的 models.py 文件中不存在。我该如何解决?那个领域在哪里?我应该进入并从那里手动删除它是否在我的 SqlLite 中?
注意:我已手动删除损坏的迁移文件,并且还恢复到更改之前的以前的 GIT 版本。没有任何效果,python manage.py migrate
似乎还是坏了..
【问题讨论】:
您之前是否已经拥有该字段然后更改它? 【参考方案1】:虽然我没有使用 South(我认为),但以下解决了我的问题:
Backwards migration with Django South
具体来说,我遵循了以下步骤:
从 models.py 中删除罪魁祸首字段 删除罪魁祸首迁移文件及其 .pyc 对应文件 将迁移回滚到错误之前的数字,例如$ python manage.py migrate MY_APP_NAME 0024
运行迁移:
没有要应用的迁移。
虽然最后一步似乎什么也没做,但现在当我运行 makemigrations 和 migrate 时,一切都很好,零错误。
【讨论】:
不错的答案,没有考虑向后迁移。【参考方案2】:TL;DR:尝试在 app/migrations 中编辑最新的迁移 .py 文件。
我自己也遇到了类似的问题(Django 1.8.6,Postgresql)。我想创建一个现有类的子类,并想将一个字段从基类移动到子类。我(我认为)从父类中删除了有问题的字段,但是当我运行python manage.py migrate
时,我收到一条错误消息,指出子类中的字段与基类中的类似名称的字段发生冲突。
我查看了最后一个迁移 .py 文件(在 app/migrations 中),并注意到从基类中删除字段的命令在创建子类的命令之后。所以我编辑了迁移文件(更改了命令的顺序),python manage.py migrate
运行良好。
【讨论】:
【参考方案3】:您可以通过以下简单步骤解决此问题:
-
删除
migrations
文件夹中所有 python 生成的迁移。
手动清除django_migrations
表中的所有数据。
一切都应该正常。
【讨论】:
以上是关于Django 迁移损坏,不会忘记已删除的列的主要内容,如果未能解决你的问题,请参考以下文章
django报错:django.db.utils.OperationalError: no such table: