回滚到以前的迁移时出错

Posted

技术标签:

【中文标题】回滚到以前的迁移时出错【英文标题】:Errors when rolling back to previous migration 【发布时间】:2016-08-26 16:57:25 【问题描述】:

这是我目前的状态:

mainapp
 [X] 0001_initial
 [X] 0002_authorprofile_uuid
 [X] 0003_auto_20151107_1243
 [X] 0004_article_approved
 [X] 0005_auto_20151129_0950
 [X] 0006_article_category
 [X] 0007_auto_20160501_1601

我想回到 0005。但是,当我运行 /manage.py migrate mainapp 0005_auto_20151129_0950 时,我收到错误 ValueError: The database backend does not accept 0 as a value for AutoField.

这是我在 models.py 中修复的错误,所以我想回到 0005 重新开始,然后重新进行迁移。

class Article(models.Model):
    category = models.ForeignKey(Category, default = 1) #trying to add this and set default value. It was first set to 0 but changed it to 1 after it failed

【问题讨论】:

对不起,现在我对真正的问题有了更好的理解。将字段从 Auto 更改为 ForeignKey 后,您似乎最终在该字段中插入了 0。例如,如果您尝试插入零,mysql 不允许在自动字段中使用 0,它会插入下一个自动增量值。所以问题不在于代码,而在于数据,或者在我看来就是这样。 @e4c5 基本上 0007 认为该字段在数据库中,但实际上不是。那里没有专栏。因此,如果我更改默认值,则无法更改,因为该列不存在。如果我尝试删除该字段,它不能因为它不存在 @e4c5 如果我只是通过 SQL 命令添加一列然后迁移到删除它会怎样?然后下降将起作用。 【参考方案1】:

我的建议是打开你的 sql 控制台并转储 django_migrations 表。

DELETE FROM django_migrations WHERE app='mainapp'

然后确保迁移/文件夹中的所有文件都已签入版本控制并删除它们!然后做

./manage.py makemigrations mainapp
./manage.py migrate mainapp --fake

如果 --fake 不起作用,那么是时候采取绝望的措施了,--fake-initial 但是当您将应用程序部署到其他地方时,您很可能不得不再次经历这一切过程 :(

【讨论】:

以上是关于回滚到以前的迁移时出错的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Asp.net 中回滚到特定迁移

sql 事务自动回滚

当单值事件或事务的嵌套 ValueEventListener 失败时,如何在 Firebase Realtime DB for Android 中回滚到以前的状态?

回滚到以前版本的 WiX 捆绑安装程序

如何回滚到SVN中的以前版本

如何在 Amazon S3 存储桶中回滚到以前的版本?