检查挂起的Django迁移

2024-05-13 12:07:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django中,是否有一种简单的方法可以检查是否所有数据库迁移都已运行?我找到了manage.py migrate --list,这给了我想要的信息,但是格式不是很好的机器可读性。

对于上下文:我有一个脚本,在数据库迁移之前不应该开始运行。出于各种原因,从运行迁移的进程发送信号将是很困难的。所以我想让我的脚本定期检查数据库,看看是否所有的迁移都已运行。


Tags: django方法py脚本机器信息数据库manage
3条回答

试试看

python manage.py migrate --list | grep "\[ \]\|^[a-z]" | grep "[ ]" -B 1

回报

<app_1>
 [ ] 0001_initial
 [ ] 0002_auto_01201244
 [ ] 0003_auto_12334333

<app_2>
 [ ] 0031_auto_12344544
 [ ] 0032_auto_45456767
 [ ] 0033_auto_23346566

<app_3>
 [ ] 0008_auto_3446677


更新:

如果您已经更新了Django版本>;=1.11,请使用下面的命令

python manage.py showmigrations | grep '\[ \]\|^[a-z]' | grep '[  ]' -B 1

外壳

到目前为止我找到的唯一简单的解决办法就是

./manage.py showmigrations | grep '\[ \]'

它将输出一个空字符串,以防所有迁移都已应用。

但是,它与输出格式密切相关。

Python

我检查了^{}命令的源代码,看起来这应该可以做到:

from django.db.migrations.executor import MigrationExecutor
from django.db import connections, DEFAULT_DB_ALIAS


def is_database_synchronized(database):
    connection = connections[database]
    connection.prepare_database()
    executor = MigrationExecutor(connection)
    targets = executor.loader.graph.leaf_nodes()
    return not executor.migration_plan(targets)

# Usage example.
if is_database_synchronized(DEFAULT_DB_ALIAS):
    # All migrations have been applied.
    pass
else:
    # Unapplied migrations found.
    pass

1.10发行说明:

The new makemigrations --check option makes the command exit with a non-zero status when model changes without migrations are detected.

相关问题 更多 >