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
相关产品推荐
相关产品推荐

