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中明确指定测试数据库的名称,比如:
这样Django会一直识别这个固定的测试库,即使执行了DATABASES = { 'default': { # 原有数据库配置 }, 'test': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'fixed_test_db.sqlite3', } }--noinput,只要数据库文件未被删除,--keep就能正常跳过迁移。 - 手动同步测试库状态:执行
--noinput后,先手动运行manage.py migrate --database=test(如果测试库是单独配置的),再执行manage.py test --keep,也能避免二次迁移。
内容的提问来源于stack exchange,提问作者batusek
相关产品推荐
相关产品推荐

