我听过这样的观点:在Django中,混合数据迁移和结构迁移是一种不好的做法。即使您在Migration类中指定了atomic = False。但我找不到有关此主题的任何信息。甚至我比较熟练的同事也无法回答这个问题。
那么,混合数据迁移和结构迁移是否不好?如果可以,为什么?如果我这样做会发生什么?
答案 0 :(得分:1)
在一次迁移中不混合数据和模式迁移是有实际原因的,在 Django 文档的 entry for RunPython
operation 中提到:
在支持 DDL 事务(SQLite 和 PostgreSQL)的数据库上,除了为每次迁移创建的事务之外,RunPython
操作不会自动添加任何事务。因此,例如,在 PostgreSQL 上,您应该避免在同一迁移中组合架构更改和 RunPython
操作,否则您可能会遇到 OperationalError: cannot ALTER TABLE "mytable" because it has pending trigger events
之类的错误。
还需要注意的是,对于不支持 DDL 事务的数据库,当数据和模式迁移操作没有混合在一起时,可能更容易在迁移尝试失败后修复数据库,因为数据迁移操作可以回滚自动在 Django 中。
答案 1 :(得分:0)
过去,最佳做法是将它们分开。 docs本节的第二句话说:
更改数据的迁移通常称为“数据迁移”; 最好将它们写成单独的迁移,并与您 模式迁移。
但是没有列出任何原因。从Django〜2.0开始,我一直允许架构迁移进行小数据迁移。但是,有时候迁移根本无法与架构迁移一起运行。我遇到过两种主要情况。