Django测试报错PostgreSQL列不存在,求原因及调试方法
问题分析与解决方案:Django测试时找不到重命名的数据库字段
兄弟,你这问题其实踩了Django测试的一个典型坑——测试用的是全新创建的临时数据库,不是你日常开发用的那个数据库!你在psql里查的是开发库的表,但manage.py test会自动创建一个干净的测试库,从头执行所有迁移,所以问题出在测试数据库的迁移流程里,和你当前的开发库没关系。
可能的具体原因
- 测试数据库的迁移没有正确执行(比如迁移依赖错误、迁移文件被跳过)
- Django缓存了旧的模型定义,导致测试时加载的还是带
desktop_pay的旧模型 - 迁移文件之间存在冲突(比如后续迁移又修改了这个字段)
一步步调试与解决
1. 查看测试迁移的详细日志
先给测试命令加--verbosity 2参数,这样能看到测试数据库创建和迁移执行的完整过程:
python manage.py test --verbosity 2
重点看输出里有没有执行你那篇重名字段的迁移(比如文件名是0056_xxx),如果没看到它被执行,说明迁移依赖或者排序有问题。
2. 手动排查测试数据库
直接手动创建测试数据库并执行迁移,看看问题到底出在哪:
# 先根据你settings.py里的配置,创建测试库(比如默认是test_你的库名) createdb test_mydatabase # 执行所有迁移到测试库 python manage.py migrate --database default # 进入测试库查看表结构 psql test_mydatabase \d+ instructions_instruction
如果这里也看不到pay字段,那说明迁移本身有问题:
- 检查你的重命名迁移依赖的
0055_auto_20180517_1508是否真的创建了desktop_pay字段 - 看看有没有后续的迁移文件(比如
0057_xxx)又把pay改回了desktop_pay或者删除了它
3. 清除缓存并确认模型一致性
确保你的Instruction模型里已经把desktop_pay改成了pay,然后清除Django的缓存:
python manage.py clearcache
有时候Python的模块缓存会导致测试时加载旧的模型文件,重启终端也能解决这个问题。
4. 重置迁移(终极方案)
如果以上都没用,可以尝试重置迁移文件(记得先备份!):
# 备份现有迁移文件 mkdir instructions/migrations/backup mv instructions/migrations/*.py instructions/migrations/backup/ # 保留__init__.py touch instructions/migrations/__init__.py # 重新生成初始迁移 python manage.py makemigrations instructions # 执行迁移到测试库 python manage.py migrate --database default
之后再运行测试,应该就能正常识别pay字段了。
内容的提问来源于stack exchange,提问作者Greg K
相关产品推荐
相关产品推荐

