繁体   English   中英

在一个迁移文件 (Django) 中混合数据和模式迁移?

[英]Mix data and schema migrations in one migrations file (Django)?

我听说在 Django 中混合数据迁移和结构迁移是不好的做法。 即使您在 Migration 类中指定 atomic=False 。 但我找不到有关此主题的任何信息。 甚至我更多的经验同事也无法回答这个问题。

那么,混合数据和结构迁移是不是很糟糕? 如果是为什么? 如果我这样做,究竟会发生什么?

在一次迁移中不混合数据和模式迁移有一个实际原因,在 Django 文档中RunPython操作条目中提到:

在支持 DDL 事务(SQLite 和 PostgreSQL)的数据库上,除了为每次迁移创建的事务之外, RunPython操作不会自动添加任何事务。 因此,例如,在 PostgreSQL 上,您应该避免在同一迁移中组合模式更改和RunPython操作,否则您可能会遇到类似OperationalError: cannot ALTER TABLE "mytable" because it has pending trigger events

还需要注意的是,对于不支持 DDL 事务的数据库,当数据和模式迁移操作没有混合在一起时,在迁移尝试失败后修复数据库可能更容易,因为数据迁移操作可以在 Django 中自动回滚.

过去,最佳做法是将它们分开。 文档中本节的第二句话说:

改变数据的迁移通常称为“数据迁移”; 它们最好作为单独的迁移编写,与您的架构迁移一起使用。

但没有列出任何原因。 从 Django ~2.0 开始,我一直允许通过模式迁移进行小数据迁移。 但是,有时迁移根本无法与架构迁移一起运行。 我遇到过两种主要情况。

  1. 数据迁移需要很长时间,一开始就不应该是迁移。 解决方案是简单地运行一个脚本,该脚本执行数据迁移所具有的功能,但分批进行。
  2. 尝试添加/更新数据,然后创建索引。 这迫使我将迁移拆分为两个单独的文件。 我不记得确切的错误,但它根本不会迁移。 这应该不会给您带来问题,除非有非原子迁移正在运行,这会使您的数据库处于意外状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM