Python使用psycopg2连接PostgreSQL报OperationalError如何解决?
psycopg2连接PostgreSQL抛出OperationalError错误原因及修复方案
错误产生原因
psycopg2.OperationalError属于连接层面的错误,说明客户端无法和PostgreSQL数据库服务建立有效连接,常见触发原因如下:
- PostgreSQL服务未启动:Windows系统下PostgreSQL默认不会强制开机自启,手动关闭或者重启系统后服务可能处于停止状态
- 连接参数错误:你指定的
database1数据库未创建、postgres用户密码不匹配、PostgreSQL实际监听端口不是默认的5432都可能触发该错误 - DSN连接串格式不规范:你当前使用的带单引号的DSN串可能出现解析异常
- 额外隐藏问题:你代码中SQL语句的
IF写为了带点的土耳其语字符İ,连接成功后执行SQL也会报错
修复步骤
- 检查PostgreSQL服务状态
按下Win+R输入services.msc打开服务管理器,找到名称以postgresql开头的服务,右键选择启动,也可以将启动类型改为自动,避免后续重启系统后重复出现该问题 - 核对连接参数
先通过pgAdmin或者psql命令行确认database1数据库已存在、postgres用户密码为postgres123、PostgreSQL监听端口为5432,任意参数不符都修改为实际值 - 修改代码写法,规避格式问题
推荐使用关键字参数传递连接配置,同时修正SQL语句的字符错误,修改后代码如下:
import psycopg2 def create_table(): conn = psycopg2.connect( dbname="database1", user="postgres", password="postgres123", host="localhost", port="5432" ) cur = conn.cursor() # 修正了原代码中土耳其语İ的错误,改为英文IF cur.execute("CREATE TABLE IF NOT EXISTS store (item TEXT, quantity INTEGER, price REAL)") conn.commit() conn.close() create_table()
- 排查端口与防火墙拦截
打开命令提示符执行netstat -ano | findstr "5432",如果没有返回监听记录,说明PostgreSQL未正常启动或者监听端口被修改;如果有监听记录仍然无法连接,可以临时关闭Windows防火墙测试,确认是否为防火墙拦截了数据库连接请求
内容的提问来源于stack exchange,提问作者sinan urgun
相关产品推荐
相关产品推荐

