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

执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:58