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

Django测试用例运行时测试数据库缺失本地数据库已存在列的问题

Django测试提示列不存在但本地数据库存在的解决建议

我的Django应用启动正常,执行python manage.py runserver 127.0.0.1:8888后日志显示一切正常:

(venv) PS C:\Users\mtmcd\Azure Devops\Blindspot> python manage.py runserver 127.0.0.1:8888
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 19, 2022 - 11:02:25
Django version 3.0.8, using settings 'blindspot.settings'
Starting development server at http://127.0.0.1:8888/
Quit the server with CTRL-BREAK.
[19/May/2022 11:02:48] "GET /endpoints/list HTTP/1.1" 200 82572

但运行测试用例python manage.py test时报错,提示列agents_simulationaction.alert_test_name不存在,而这个列在本地数据库中是存在的,且对应的是较早的迁移文件。日志如下:

(venv) PS C:\Users\mtmcd\Azure Devops\Blindspot> python manage.py test
Creating test database for alias 'default'...
Traceback (most recent call last):
  File "C:\Users\mtmcd\Azure Devops\Blindspot\venv\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column agents_simulationaction.alert_test_name does not exist
LINE 1: ...d", "agents_simulationaction"."security_tool_id", "agents_si...

遇到这种测试库和本地开发库不一致的问题,通常是测试数据库的迁移流程出现了异常,下面是几个针对性的解决建议:

1. 验证迁移文件的执行状态与完整性

Django在运行测试时会创建全新的测试数据库,并依次执行所有迁移文件。如果某个迁移没被正确执行,或者后续迁移意外修改了该字段,就会导致测试库缺失字段:

  • 运行python manage.py showmigrations,查看所有涉及agents应用的迁移是否都标记为[X](表示已执行)。
  • 打开创建alert_test_name列的迁移文件,确认代码没有语法错误,且后续没有迁移文件删除或重命名该字段。

2. 强制重建测试数据库的迁移状态

测试数据库的缓存或残留数据可能导致迁移异常,你可以手动清理并重新构建:

  • 先删除测试数据库(PostgreSQL中可执行DROP DATABASE test_<your_db_name>;,测试库名称一般是test_加上你的开发库名称)。
  • 运行python manage.py test,让Django重新创建测试库并执行所有迁移。如果还是有问题,可以尝试先同步本地迁移再测试:
    python manage.py migrate --run-syncdb
    python manage.py test
    
    如果你想保留测试库避免重复创建,可使用--keepdb参数,之后手动为测试库执行迁移:
    python manage.py test --keepdb
    python manage.py migrate
    

3. 检查测试环境的数据库配置

确认测试环境是否使用了和本地开发不同的数据库:

  • 打开settings.py,查看DATABASES配置中的TEST块,确认测试库名称正确,且没有指向其他未迁移的数据库。例如:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'blindspot',
            # 其他配置
            'TEST': {
                'NAME': 'test_blindspot',
            },
        }
    }
    
    如果测试库配置错误,修改后重新运行测试。

4. 确保模型与迁移文件一致

有时候模型字段已添加,但迁移文件未正确生成或更新:

  • 打开agents/models.py,确认SimulationAction模型确实包含alert_test_name字段,且字段定义和迁移文件中的一致。
  • 如果存在不一致,重新生成并应用迁移:
    python manage.py makemigrations agents
    python manage.py migrate agents
    
    完成后再运行测试。

5. 清理迁移缓存

Django会缓存迁移的执行状态,缓存异常可能导致测试时未正确执行迁移:

  • 删除项目中所有__pycache__目录,尤其是agents/migrations下的缓存文件。
  • 重新运行python manage.py test,看问题是否解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:27:47