如何在压缩它们后删除 django 迁移?

Posted

技术标签:

【中文标题】如何在压缩它们后删除 django 迁移?【英文标题】:How to delete django migrations after squashing them? 【发布时间】:2015-08-18 10:10:52 【问题描述】:

Django 文档说我们可以在压缩迁移后删除它们:

您应该提交此迁移,但保留旧迁移;这 新迁移将用于新安装。一旦你确定所有 代码库的实例已应用您压缩的迁移, 你可以删除它们。

这里,删除是否意味着只删除迁移文件,或者 django_migrations 表中的条目?

这里有一些背景:我只有开发机器,所以只有一个代码库。在压缩了我已经应用的一些迁移之后,我删除了文件和数据库条目。通过进行迁移测试是否可以,它没有找到任何东西。所以,一切看起来都很好。第二天,我不得不改变一些东西,并进行了迁移。当我尝试迁移时,它也尝试应用压扁的迁移(在被压扁之前逐部分应用)。因此,我不得不返回并重新创建 django_migrations 表中的条目。所以,似乎我不得不保留数据库条目。我试图确保在我再次搞砸任何事情之前,先了解为什么它看起来不错,然后尝试应用压缩的迁移。

【问题讨论】:

【参考方案1】:

压缩的迁移永远不会标记为已应用,这将在 1.8.3 中修复(请参阅 #24628)。

删除旧迁移的步骤是:

    确保应用了所有替换的迁移(或一个都不应用)。 删除旧的迁移文件,从压缩的迁移中删除 replaces 属性。 (解决方法)运行./manage.py migrate <app_label> <squashed_migration> --fake

当 1.8.3 到来时,最后一步将不再必要。

【讨论】:

【参考方案2】:

自从问题发布以来,转换压缩迁移变得更加容易。我发布了一个small sample project,它展示了如何使用循环依赖来压缩迁移,它还展示了在所有安装都迁移到压缩点之后如何将压缩迁移转换为常规迁移。

正如Django documentation 所说:

然后,您必须通过以下方式将压缩迁移转换为正常迁移:

删除它替换的所有迁移文件。 将所有依赖于已删除迁移的迁移更新为依赖于压缩的迁移。 删除压缩迁移的 Migration 类中的 replaces 属性(这是 Django 告诉它是压缩迁移的方式)。

【讨论】:

【参考方案3】:

无论如何我都不是专家,但我只是压缩了我的迁移,并最终做了以下事情:

运行此查询以删除旧迁移(压缩)

DELETE FROM south_migrationhistory;

运行此管理命令以删除镜像迁移

./manage.py migrate --fake --delete-ghost-migrations 

Django 1.7 也有squashmigrations

【讨论】:

我应该提到我使用的是 Django 1.8,所以这不是南迁移。不过感谢您的回答。

以上是关于如何在压缩它们后删除 django 迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除Django模型而不是数据库?

压缩 Django 迁移时的循环依赖

如何在 django (1.8) 迁移中删除索引 varchar_pattern_ops?

Django 中的模型表被删除

如何在 Firebase 中删除 tableview 项目后删除它们

使用 --fake 后如何在 django 1.8 上重做迁移