Docker部署PostgreSQL后psycopg2.OperationalError连接问题求助
PostgreSQL容器psycopg2连接失败但pgAdmin正常的排查方案
问题描述
我将PostgreSQL容器部署在Docker中,可通过pgAdmin正常连接,但使用psycopg2连接时触发psycopg2.OperationalError。尝试多种方法均无效,相关配置及代码如下:
Docker Compose配置
services: db: container_name: "db" image: postgres:14.1-alpine restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres - POSTGRES_PORT=5432 - POSTGRES_HOST=db - POSTGRES_HOST_AUTH_METHOD=trust - PGDATA=/var/lib/postgresql/data/pgdata ports: - "5432:5432" networks: - custom
Python连接代码
import psycopg2 # Параметры подключения к базе данных PostgreSQL db_name = 'postgres' db_user = 'postgres' db_password = 'postgres' db_host = 'db' conn =psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host) # Создание курсора для выполнения SQL запросов cursor = conn.cursor() # Пример выполнения запроса SELECT cursor.execute("SELECT * FROM users") # Получение результатов запроса rows = cursor.fetchall() # Вывод результатов for row in rows: print(row) # Закрытие курсора и соединения cursor.close() conn.close()
报错信息
Traceback (most recent call last): File "c:\Мои проекты\pythonProject\db\conect.py", line 48, in <module> conn =psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host) File "C:\Мои проекты\pythonProject\.venv\lib\site-packages\psycopg2\__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) psycopg2.OperationalError
排查方案
网络访问权限问题
- 如果Python代码在宿主机运行:
db是Docker自定义网络的内部别名,宿主机无法直接解析,需将db_host改为localhost或宿主机IP。 - 如果Python代码在其他Docker容器运行:需确保该容器加入了
custom网络,否则无法访问db服务。
- 如果Python代码在宿主机运行:
无效环境变量清理
- Postgres镜像不识别
POSTGRES_PORT和POSTGRES_HOST变量,直接删除即可,避免配置混淆。
- Postgres镜像不识别
版本兼容性验证
- 检查psycopg2版本与PostgreSQL 14.1的兼容性,可安装适配版本:
pip install psycopg2-binary==2.9.9。
- 检查psycopg2版本与PostgreSQL 14.1的兼容性,可安装适配版本:
服务初始化状态检查
- 查看容器日志确认PostgreSQL是否完全启动:
docker logs db,等待出现database system is ready to accept connections日志后再尝试连接。
- 查看容器日志确认PostgreSQL是否完全启动:
端口占用与防火墙排查
- 检查宿主机5432端口是否被占用:Windows用
netstat -ano | findstr :5432,Linux/Mac用lsof -i :5432。若被占用,修改容器映射端口(如5433:5432),并在代码中添加port=5433参数。
- 检查宿主机5432端口是否被占用:Windows用
内容的提问来源于stack exchange,提问作者Zalim
相关产品推荐
相关产品推荐

