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

Django 5.1 借助pg_service与pgpass连接PostgreSQL失败(报Peer认证错误)

Django 5.1 借助pg_service与pgpass连接PostgreSQL失败(报Peer认证错误)

我来帮你梳理下问题所在,其实核心原因已经藏在错误提示里啦——Peer authentication failed,这说明PostgreSQL在尝试用「基于操作系统用户名的peer认证」,而不是你配置的密码认证,所以你的.pgpass根本没派上用场!

先解释下为啥psql能连但Django不行:
你测试用的命令是 psql -h localhost -U dbms dbms_db,这里的-h localhost强制走TCP连接,PostgreSQL会触发密码认证,所以读取了你的.pgpass;但Django用pg_service配置的host=/var/run/postgresql是Unix套接字连接,PostgreSQL默认对本地套接字用peer认证,直接跳过了密码验证环节,自然就报错了。

给你两个解决方向,选一个就行:

方向一:强制走TCP连接(最简单)

修改你的~/.pg_service.conf,把host改成localhost,这样就会触发密码认证,让.pgpass生效:

[my_service]
host=localhost
user=dbms
dbname=dbms_db
port=5432

方向二:修改PostgreSQL认证规则(保留套接字连接)

如果你想继续用Unix套接字连接,需要调整pg_hba.conf的配置:

  1. 找到pg_hba.conf里的这一行:
    local   all             all                                     peer
    
  2. 把peer改成md5(或者scram-sha-256,取决于你的PostgreSQL版本)
  3. 重启PostgreSQL服务:
    sudo systemctl restart postgresql
    

额外检查:文件权限

PostgreSQL对这两个配置文件的权限要求很严,必须是600(只有所有者能读写),不然会直接忽略:

chmod 600 ~/.pg_service.conf ~/.pgpass

同时要确保这两个文件属于运行Django的用户(比如你当前的用户,或者部署时的www-data用户),避免权限不足读不到文件。

最后可以先测试下修改后的配置:用psql service=my_service命令,如果能正常连接,再启动Django就没问题啦!

备注:内容来源于stack exchange,提问作者Alex P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:23:07