Psycopg2连接本地PostgreSQL出现地址分配失败错误求助
解决Psycopg2无法连接localhost(::1)端口5432的问题
问题详情
使用Psycopg2连接PostgreSQL时出现错误:
Psycopg2: 连接到位于"localhost"(::1)、端口5432的服务器失败:无法分配请求的地址
复现步骤:
- 安装依赖:
pip install -r requirements.txt - 启动数据库:
docker compose up -d - 运行脚本:
python3 main.py
相关配置文件:
docker-compose.yml
version: '3.9' services: postgres: image: postgres:latest restart: always env_file: .env ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:
main.py
from psycopg2 import connect from os import getenv DB_USER = getenv('POSTGRES_USER') DB_PASS = getenv('POSTGRES_PASSWORD') DB_HOST = getenv('POSTGRES_HOST', 'localhost') DB_PORT = getenv('POSTGRES_PORT', '5432') DB_NAME = getenv('POSTGRES_NAME') try: conn = connect( database=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST, port=DB_PORT ) print("Database connected successfully") except Exception as e: print(f"Database not connected successfully: {e}")
解决方案
方案1:强制使用IPv4地址连接
将连接地址从localhost改为127.0.0.1,避免localhost优先解析到IPv6地址导致连接失败。可通过两种方式实现:
- 在
.env文件中添加:POSTGRES_HOST=127.0.0.1 - 直接修改
main.py中的默认值:DB_HOST = getenv('POSTGRES_HOST', '127.0.0.1')
方案2:配置PostgreSQL监听IPv6地址
如果需要保留localhost作为连接地址,需修改PostgreSQL配置使其支持IPv6监听。在docker-compose.yml的postgres服务中添加启动命令:
services: postgres: # 其他配置保持不变 command: postgres -c listen_addresses='*' -c ipv6=on
修改后重启容器:docker compose down && docker compose up -d
方案3:验证Docker容器状态
- 确认Postgres容器正常运行:
docker ps,查看容器状态是否为Up - 查看Postgres启动日志,确认监听端口:
docker logs <postgres-container-id>,日志中应包含类似listening on IPv4 address "0.0.0.0", port 5432或listening on IPv6 address "::", port 5432的内容 - 验证本地端口是否被占用:
lsof -i :5432(Linux/macOS)或netstat -ano | findstr :5432(Windows),确保5432端口未被其他程序占用
内容的提问来源于stack exchange,提问作者Bruno Henrique Peixoto
相关产品推荐
相关产品推荐

