You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django单元测试用--keep后migrations仍二次执行的问题咨询

Django测试时--keep参数失效的问题解决

这不是Django的默认预期行为,而是--noinput与--keep参数交互时的状态标记重置问题。

问题原因

当使用manage.py test --noinput时,Django会强制重置测试数据库(包括重新执行所有迁移、覆盖原有测试库状态),同时清除之前--keep参数留下的数据库状态标记。此时下一次执行manage.py test --keep时,Django会误认为测试数据库是全新创建的,因此会再次执行迁移;完成这次迁移后,状态标记会被重新正确记录,第三次及之后的--keep命令就能正常跳过迁移了。

避免二次迁移的解决办法

  • 替换manage.py test --noinput为manage.py test --noinput --keep:这样在强制执行迁移的同时,会保留正确的数据库状态标记,下一次使用--keep时就不会重复执行迁移。
  • 固定测试数据库名称:在项目的settings.py中明确指定测试数据库的名称,比如:
    DATABASES = {
        'default': {
            # 原有数据库配置
        },
        'test': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'fixed_test_db.sqlite3',
        }
    }
    
    这样Django会一直识别这个固定的测试库,即使执行了--noinput,只要数据库文件未被删除,--keep就能正常跳过迁移。
  • 手动同步测试库状态:执行--noinput后,先手动运行manage.py migrate --database=test(如果测试库是单独配置的),再执行manage.py test --keep,也能避免二次迁移。

内容的提问来源于stack exchange,提问作者batusek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:40:30