【问题标题】:Mix data and schema migrations in one migrations file (Django)?在一个迁移文件(Django)中混合数据和模式迁移?
【发布时间】:2020-03-22 23:43:20
【问题描述】:

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

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

【问题讨论】:

    标签: django django-migrations


    【解决方案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 中。

    【讨论】:

      【解决方案2】:

      过去,最佳做法是将它们分开。 docs这部分的第二句说:

      改变数据的迁移通常称为“数据迁移”; 它们最好写成单独的迁移,与你的 架构迁移。

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

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

      【讨论】:

      • 如果您在 MySQL 上运行组合架构和数据迁移,那么您的数据迁移代码中的异常将导致非常糟糕的时刻,而 MySQL 从内存中会出现事务和架构更改的问题。
      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2014-09-17
      • 2016-06-22
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多