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

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服务。
  • 无效环境变量清理

    • Postgres镜像不识别POSTGRES_PORT和POSTGRES_HOST变量,直接删除即可,避免配置混淆。
  • 版本兼容性验证

    • 检查psycopg2版本与PostgreSQL 14.1的兼容性,可安装适配版本:pip install psycopg2-binary==2.9.9。
  • 服务初始化状态检查

    • 查看容器日志确认PostgreSQL是否完全启动:docker logs db,等待出现database system is ready to accept connections日志后再尝试连接。
  • 端口占用与防火墙排查

    • 检查宿主机5432端口是否被占用:Windows用netstat -ano | findstr :5432,Linux/Mac用lsof -i :5432。若被占用,修改容器映射端口(如5433:5432),并在代码中添加port=5433参数。

内容的提问来源于stack exchange,提问作者Zalim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:27