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

使用Django parallel参数测试时如何正确执行模型迁移?

Django并行测试多测试库未执行迁移问题修复方案

问题根因

Django的并行测试机制中,主进程仅会初始化1个默认测试数据库并执行全量迁移,当你指定--parallel=3参数时,后续启动的3个并行测试子进程会各自创建带数字后缀的独立测试库(如test_xxx_1、test_xxx_2、test_xxx_3),但子进程默认不会触发迁移流程,因此后缀结尾的测试库为空,就会抛出1146 Table 'xxx' doesn't exist的错误。

可选修复方案

  • 方案1:加--keepdb参数快速解决(适合本地调试)
    开启参数后所有子进程会复用主进程已经建好表结构的测试库,不会额外创建空的后缀测试库,无需改动代码,修改后的测试命令如下:
    python manage.py test --settings=server.settings.test --parallel=3 --keepdb
    
  • 方案2:自定义测试运行器(适合需要多库隔离的CI/CD场景)
    如果你需要每个并行子进程使用完全隔离的独立测试库,可以重写测试运行器的子进程初始化逻辑,强制子进程建库后执行迁移:
    1. 在项目对应应用下新建test_runner.py文件,代码如下:
    from django.test.runner import DiscoverRunner, ParallelTestSuite
    
    class ParallelMigrateTestSuite(ParallelTestSuite):
        def init_worker(self, counter):
            # 子进程初始化时为当前进程对应的测试库执行迁移
            from django.db import connections
            for alias in connections:
                connections[alias].creation.create_test_db(serialize=False)
            super().init_worker(counter)
    
    class CustomTestRunner(DiscoverRunner):
        parallel_test_suite_class = ParallelMigrateTestSuite
    
    1. 有两种方式启用自定义运行器:
      • 单次运行时在命令中指定:
      python manage.py test --settings=server.settings.test --parallel=3 --testrunner=你的应用名.test_runner.CustomTestRunner
      
      • 永久生效:在测试配置文件server.settings.test中添加配置:
      TEST_RUNNER = "你的应用名.test_runner.CustomTestRunner"
      
  • 方案3:升级Django版本(最优解)
    Django 4.2及以上版本已经官方修复了并行测试的迁移同步问题,升级后无需额外配置即可自动为所有子进程的测试库执行迁移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:45:08