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

问题描述 投票:0回答:4

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

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

这里的删除是指仅删除迁移文件,还是同时删除 django_migrations 表中的条目?

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

django migration django-migrations squash
4个回答
9
投票

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

删除旧迁移的步骤是:

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

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


2
投票

自从问题发布以来,转换压缩的迁移变得更加容易。我发布了一个小示例项目,它展示了如何压缩具有循环依赖项的迁移,并且还展示了如何在所有安装都迁移到压缩点之后将压缩的迁移转换为常规迁移。

正如 Django 文档 所说:

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

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

0
投票

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

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

DELETE FROM south_migrationhistory;

运行此管理命令以删除幻影迁移

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

Django 1.7 也有 squashmigrations


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.