执行Django测试用例时触发psycopg2游标不存在OperationalError
解决Django测试销毁数据库时出现psycopg2游标不存在的错误
我之前也碰到过一模一样的问题,这大概率是Django和psycopg2在数据库连接/游标处理上的兼容性问题,或者是测试流程中连接被意外中断导致的。下面是几个亲测有效的解决办法:
1. 升级psycopg2版本
这个错误在旧版psycopg2搭配新Django时特别常见,先把依赖升到最新稳定版试试:
pip install --upgrade psycopg2-binary
如果你的环境要求源码编译版本,替换成psycopg2即可。
2. 调整settings.py中的数据库TEST配置
在项目的数据库配置里添加测试专属参数,强制禁用连接持久化或避免序列化操作:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'project_management_db', # 你的其他数据库配置... 'TEST': { 'NAME': 'test_project_management_db', 'CONN_MAX_AGE': 0, # 关闭连接池,每次请求用新连接 'SERIALIZE': False, # 跳过可能引发游标问题的序列化步骤 }, } }
3. 手动清理残留的测试数据库
有时候旧数据库里的异常连接没清干净,先手动删了再跑测试:
# 进入PostgreSQL命令行(替换成你的数据库用户名) psql -U your_db_username # 删除测试数据库 DROP DATABASE IF EXISTS test_project_management_db; # 退出命令行 \q # 重新运行测试 python manage.py test
4. 排查自定义数据库组件
如果项目里有自定义的数据库中间件、信号处理器(比如测试前后修改连接的代码),可能会意外关闭游标。先暂时禁用这些自定义代码,看看错误是否消失,逐步定位问题点。
5. 临时用--keepdb跳过销毁步骤
要是上面的方法都没起效,可以先让测试跳过销毁旧数据库的步骤,保证测试能先跑起来:
python manage.py test --keepdb
这只是临时规避方案,还是建议找到根本原因彻底解决。
补充:这个错误的本质是Django清理测试库时,尝试关闭一个已经被PostgreSQL服务器回收的游标。一般升级依赖或调整连接配置就能解决。
内容的提问来源于stack exchange,提问作者Ankit Kumar Rathod
相关产品推荐
相关产品推荐

