代码之家  ›  专栏  ›  技术社区  ›  taleinat

如何判断迁移是否可逆?

  •  1
  • taleinat  · 技术社区  · 8 年前

    在我正在处理的一个项目中,我们对生产数据库的快照运行一些测试。对于包括迁移在内的更改,我想应用迁移、运行测试并反转迁移。

    然而,并非所有的迁移都是可逆的。我怎么能有一个 自动化 在应用之前,进程检测是否所有必需的迁移都是可逆的?

    1 回复  |  直到 8 年前
        1
  •  1
  •   taleinat    8 年前

    几天没人接电话,我就想办法解决了。 This SO answer 是一个很好的起点。

    from django.db.migrations.executor import MigrationExecutor
    from django.db import connections, DEFAULT_DB_ALIAS
    
    def are_migrations_reversible(target_migrations, database=DEFAULT_DB_ALIAS):
        """check if all migrations required to reach the target migrations are reversible
    
        `target_migrations` is an iterable of (app_label, migration_name) 2-tuples.
        """
        connection = connections[database]
        connection.prepare_database()
        executor = MigrationExecutor(connection)
        migration_plan = executor.migration_plan(list(target_migrations))
    
        return all(
            operation.reversible
            for (migration, is_backwards) in migration_plan
            for operation in migration.operations
        )
    

    上述操作需要确定目标迁移,可以从 showmigrations 管理命令,或者进一步使用内部django迁移代码。