Python无密码连接PostgreSQL:新环境fe_sendauth报错的原因与配置方案
问题分析与解决办法
生产环境无需密码连接的原因
无非两种常见情况:
- PostgreSQL服务端信任生产服务器IP:生产环境的PostgreSQL数据库在
pg_hba.conf配置文件中,给生产应用服务器的IP设置了trust认证规则,从这个IP发起的连接,只要用户名匹配就直接放行,不需要密码。 - 客户端用了.pgpass存储密码:生产应用服务器上,运行Python代码的用户家目录下有个
.pgpass文件,里面预先存了数据库密码,psycopg2会自动读取这个文件,所以代码里不用写密码参数也能成功连接。
新环境复刻配置的步骤
方式一:服务端配置信任IP(适合内网环境)
- 登录新PostgreSQL数据库所在的服务器,找到
pg_hba.conf文件(可通过psql -c 'SHOW hba_file;'查询准确路径,常见路径比如/var/lib/postgresql/[版本号]/main/pg_hba.conf)。 - 在文件末尾添加一条信任规则,格式如下:
如果是整个内网网段,比如192.168.1.0/24,也可以写成host 你的数据库名 你的用户名 新应用服务器IP/32 trust192.168.1.0/24。 - 重启PostgreSQL服务生效:
# 系统d环境 systemctl restart postgresql # 或用service命令 service postgresql restart
方式二:客户端配置.pgpass文件(更安全)
- 在新应用服务器上,切换到运行Python代码的业务用户(比如www-data或你的专属业务账号)。
- 在用户家目录下创建
.pgpass文件,内容格式为:新数据库IP:新端口:你的数据库名:你的用户名:数据库密码 - 设置文件权限为600(PostgreSQL要求这个文件必须严格限制权限,否则不生效):
chmod 600 ~/.pgpass - 确保文件所有者是运行代码的用户,之后再运行原有Python代码就会自动读取密码,无需修改代码。
内容的提问来源于stack exchange,提问作者JacquesB
相关产品推荐
相关产品推荐

