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报错:django.db.utils.OperationalError: no such table:

Heroku 不会在 Django 中迁移模型

如果我使用 Django South 运行迁移并且它崩溃了,我的数据库是不是曾经损坏?

Django - 迁移后未创建表

Heroku 不会在 Django 上迁移模型