我创建了一个类似于此的压缩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
我已经使用python 3.6在Django 1.11中对此进行了测试。不确定Django 2+是否需要更改。
陷阱包括:
我总是对优化的迁移和原始迁移进行区分,以确保恢复有关initial
和dependencies
的更改。
或者,您可以在使用RunPython
或RunSql
elidable
参数压缩之前删除这些操作。来自文档:
可选的elidable参数确定在压缩迁移时是否删除(省略)操作。 link