如何判断迁移是否可逆?

时间:2018-05-31 14:57:33

标签: django django-migrations django-1.11

在我正在开发的项目中,我们针对生产数据库的快照运行一些测试。对于包括迁移在内的更改,我想应用迁移,运行测试以及反向迁移。

但是,并非所有迁移都是可逆的。如何在执行 自动 过程之前检测所有必需的迁移是否可逆?

1 个答案:

答案 0 :(得分:1)

几天没有回答,我继续找出解决方案。 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迁移代码进行更多努力。