优化 Django 中的压缩迁移

Optimize a squashed migration in Django

我创建了一个压缩的 Django 迁移,看起来与此类似:

add field "name"
run sql "CREATE FUNCTION x"
add field "age"
remove field "name"
run sql "DROP FUNCTION x"

由于 Django 无法完全优化两个 run sql 块之间的代码,因此预计 add field "name"remove field "name" 不会被优化掉。但是,我知道SQL运行这两个没有什么影响,所以我可以手动删除run sql部分。

手动删除 run sql 部分后,有什么办法可以让 Django 运行 只对结果进行优化步骤?

我写了一个命令,使用Django的MigrationOptimizer重写单个迁移文件,专门针对这个场景。我把它作为要点发布在这里:

https://gist.github.com/jhillacre/7fa8c182dd821387d4cf1fdb9371dcd7

我已经在 Django 1.11 中使用 python 3.6 对此进行了测试。不确定 Django 2+ 是否需要更改。

陷阱包括:

  • 优化器从迁移中删除初始标志。
  • 可交换依赖项被扭曲

我总是区分优化迁移和原始迁移,以确保恢复关于 initialdependencies 的更改。

或者,您可以使用 RunPythonRunSql elidable 参数在压缩之前删除这些操作。来自文档:

The optional elidable argument determines whether or not the operation will be removed (elided) when squashing migrations. link