Django迁移出现故障,不会忘记删除的列。
Django迁移出现故障,不会忘记删除的列。
使用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不能为空
哎呀。嗯,尝试了很多方法,比如将字段设为default=""
或者blank=True
,但都没用。算了,我删除了这个字段,并将模型恢复到一切正常的状态。模型看起来和之前一样,然后我运行makemigrations命令,它删除了这个字段(它说是这样)。很好!
然而,
$ python manage.py migrate
仍然出现相同的错误,抱怨我添加然后又删除的字段。就好像我不能让django忘记这个字段的存在。但是在我的models.py文件中并不存在这个字段。我该如何解决这个问题?这个字段在哪里?我应该去SqlLite中手动删除它吗?
注意:我已经手动删除了损坏的迁移文件,并且还回滚到了修改之前的GIT版本。但是没有任何效果,python manage.py migrate
似乎仍然有问题。
问题出现的原因是在迁移文件中,删除字段的命令在创建子类的命令之后,导致字段冲突。解决方法是编辑最新的迁移文件,调整命令的顺序,确保删除字段的命令在创建子类的命令之前。以下是详细步骤:
1. 打开应用的迁移文件夹,通常在`app/migrations`目录下。
2. 找到最新的迁移文件,通常以`.py`为后缀。
3. 使用文本编辑器打开该文件。
4. 查找包含删除字段的命令的行,通常是类似`migrations.RemoveField`的命令。
5. 查找包含创建子类的命令的行,通常是类似`migrations.CreateModel`的命令。
6. 将删除字段的命令的行移动到创建子类的命令的行之前。
7. 保存文件并关闭编辑器。
8. 在命令行中运行`python manage.py migrate`命令。
这样,迁移命令将按照正确的顺序执行,解决了字段冲突的问题。
Django migrate broken,无法忘记已删除的列
尽管我没有使用South(我想),但以下方法解决了我的问题:
Backwards migration with Django South
具体来说,我按照以下步骤操作:
- 从models.py中删除有问题的字段
- 删除有问题的迁移文件及其.pyc对应文件
- 将迁移回滚到出现错误之前的版本,例如:
$ python manage.py migrate MY_APP_NAME 0024
Running migrations:
No migrations to apply.
尽管最后一步似乎没有做任何事情,但现在当我运行makemigrations和migrate时,一切都正常,没有任何错误。
很好的答案,没有考虑到回滚迁移。