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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:03