优化 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+ 是否需要更改。
陷阱包括:
- 优化器从迁移中删除初始标志。
- 可交换依赖项被扭曲
我总是区分优化迁移和原始迁移,以确保恢复关于 initial
和 dependencies
的更改。
或者,您可以使用 RunPython
或 RunSql
elidable
参数在压缩之前删除这些操作。来自文档:
The optional elidable argument determines whether or not the operation will be removed (elided) when squashing migrations. link
我创建了一个压缩的 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+ 是否需要更改。
陷阱包括:
- 优化器从迁移中删除初始标志。
- 可交换依赖项被扭曲
我总是区分优化迁移和原始迁移,以确保恢复关于 initial
和 dependencies
的更改。
或者,您可以使用 RunPython
或 RunSql
elidable
参数在压缩之前删除这些操作。来自文档:
The optional elidable argument determines whether or not the operation will be removed (elided) when squashing migrations. link