Django迁移出现故障,不会忘记删除的列。

21 浏览
0 Comments

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似乎仍然有问题。

0
0 Comments

问题出现的原因是在迁移文件中,删除字段的命令在创建子类的命令之后,导致字段冲突。解决方法是编辑最新的迁移文件,调整命令的顺序,确保删除字段的命令在创建子类的命令之前。以下是详细步骤:

1. 打开应用的迁移文件夹,通常在`app/migrations`目录下。

2. 找到最新的迁移文件,通常以`.py`为后缀。

3. 使用文本编辑器打开该文件。

4. 查找包含删除字段的命令的行,通常是类似`migrations.RemoveField`的命令。

5. 查找包含创建子类的命令的行,通常是类似`migrations.CreateModel`的命令。

6. 将删除字段的命令的行移动到创建子类的命令的行之前。

7. 保存文件并关闭编辑器。

8. 在命令行中运行`python manage.py migrate`命令。

这样,迁移命令将按照正确的顺序执行,解决了字段冲突的问题。

0
0 Comments

问题出现的原因是因为Django的数据库迁移功能出现了错误,而且即使删除了某个列也无法忘记它。

解决方法如下:

1. 删除文件夹中所有生成的Python迁移文件。

2. 手动清除表中的所有数据。

这样就可以解决问题了。

0
0 Comments

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时,一切都正常,没有任何错误。

很好的答案,没有考虑到回滚迁移。

0