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

时间:2020-03-22 23:43:20

标签: django django-migrations

我听过这样的观点:在Django中,混合数据迁移和结构迁移是一种不好的做法。即使您在Migration类中指定了atomic = False。但我找不到有关此主题的任何信息。甚至我比较熟练的同事也无法回答这个问题。

那么,混合数据迁移和结构迁移是否不好?如果可以,为什么?如果我这样做会发生什么?

2 个答案:

答案 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开始,我一直允许架构迁移进行小数据迁移。但是,有时候迁移根本无法与架构迁移一起运行。我遇到过两种主要情况。

  1. 数据迁移需要很长时间,并且不应该首先进行迁移。解决方案是简单地运行一个脚本,该脚本可以完成数据迁移,但可以批量进行。
  2. 尝试添加/更新数据,然后创建索引。这迫使我将迁移分为两个单独的文件。我不记得确切的错误,但它根本不会迁移。除非正在运行的非原子迁移会导致数据库处于意外状态,否则这不会给您造成问题。