【发布时间】:2020-03-22 23:43:20
【问题描述】:
我听说混合数据迁移和结构迁移在 Django 中是不好的做法。即使您在 Migration 类中指定 atomic=False 。但我找不到有关此主题的任何信息。即使是我更有经验的同事也无法回答这个问题。
那么,混合数据和结构迁移是不是很糟糕?如果是,为什么?如果我这样做,究竟会发生什么?
【问题讨论】:
我听说混合数据迁移和结构迁移在 Django 中是不好的做法。即使您在 Migration 类中指定 atomic=False 。但我找不到有关此主题的任何信息。即使是我更有经验的同事也无法回答这个问题。
那么,混合数据和结构迁移是不是很糟糕?如果是,为什么?如果我这样做,究竟会发生什么?
【问题讨论】:
在一个迁移中没有混合数据和架构迁移是有实际原因的,在 Django 文档中的 entry for RunPython operation 中提到:
在支持 DDL 事务的数据库(SQLite 和 PostgreSQL)上,
RunPython操作除了为每次迁移创建的事务外,不会自动添加任何事务。因此,例如,在 PostgreSQL 上,您应该避免在同一迁移中组合架构更改和RunPython操作,否则您可能会遇到像OperationalError: cannot ALTER TABLE "mytable" because it has pending trigger events这样的错误。
还需要注意的是,对于不支持 DDL 事务的数据库,当数据和架构迁移操作不混在一起时,迁移尝试不成功后可能更容易修复数据库,因为数据迁移操作可以回滚自动在 Django 中。
【讨论】:
过去,最佳做法是将它们分开。 docs这部分的第二句说:
改变数据的迁移通常称为“数据迁移”; 它们最好写成单独的迁移,与你的 架构迁移。
但没有列出任何原因。自 Django ~2.0 以来,我一直允许通过模式迁移进行小数据迁移。但是,有时迁移根本无法与架构迁移一起运行。我遇到过两种主要情况。
【讨论】: