如何解决Django连接PostgreSQL时的连接拒绝错误?
Django连接PostgreSQL出现Connection Refused的排查方案
你的settings.py数据库配置如下:
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "NAME": "mydatabase", "USER": "myuser", "PASSWORD": "mypassword", "HOST": "localhost", "PORT": "5432", } }
执行python manage.py migrate时触发错误:
django.db.utils.OperationalError: could not connect to server: Connection refused
在确认PostgreSQL已运行、凭据正确的前提下,可从以下几个方向排查:
PostgreSQL未监听TCP/IP端口
默认情况下,部分PostgreSQL安装仅监听Unix套接字,不开启TCP/IP监听。需要修改postgresql.conf(路径通常在/var/lib/postgresql/{version}/main/或Windows的PostgreSQL安装目录下),将listen_addresses设置为'localhost'或'*',然后重启PostgreSQL服务。数据库用户无本地连接权限
即使用户名密码正确,PostgreSQL的访问控制规则(pg_hba.conf)可能限制了该用户从localhost的连接。打开pg_hba.conf,添加或修改规则:host mydatabase myuser 127.0.0.1/32 scram-sha-256 host mydatabase myuser ::1/128 scram-sha-256保存后执行
pg_ctl reload(或重启服务)加载新配置。端口被占用或防火墙拦截
- 检查5432端口是否被其他程序占用:执行
lsof -i :5432(Linux/macOS)或netstat -ano | findstr :5432(Windows),确认占用进程是否为PostgreSQL。 - 检查本地防火墙规则,确保允许5432端口的入站连接(针对localhost的TCP连接)。
- 检查5432端口是否被其他程序占用:执行
localhost解析问题
部分环境下localhost会优先解析到IPv6地址::1,但PostgreSQL可能未开启IPv6监听。可以尝试将settings.py中的HOST改为'127.0.0.1',强制使用IPv4连接。PostgreSQL实际端口非默认5432
如果安装时修改了PostgreSQL的默认端口,需要核对postgresql.conf中的port参数,将settings.py的PORT改为对应值。
内容的提问来源于stack exchange,提问作者M Haseeb Ali
相关产品推荐
相关产品推荐

