Flask+PostgreSQL数据库创建失败:postgres用户密码验证错误
我之前也踩过一模一样的坑!明明确认密码没错,但执行db.create_all()时就是弹出password authentication failed for user "postgres"的错误,给你几个我当时排查解决的方向,应该能帮到你:
检查PostgreSQL的本地认证模式
PostgreSQL默认对localhost的postgres用户用peer认证(靠系统用户匹配),而不是密码认证。你需要修改pg_hba.conf配置文件:- 找到这个文件:Linux一般在
/etc/postgresql/[你的PostgreSQL版本]/main/pg_hba.conf,Windows在PostgreSQL安装目录的data文件夹里 - 找到类似下面的行:
local all postgres peer
- 把
peer改成md5,保存文件 - 重启PostgreSQL服务(Linux用
systemctl restart postgresql,Windows在服务管理器里重启)
- 找到这个文件:Linux一般在
手动测试psql连接
先跳过Flask,直接用终端命令测试数据库连接:psql -U postgres -d lexus -h localhost输入你的密码
mypassword,如果这个命令都连不上,那问题出在PostgreSQL本身的配置,和Flask无关;如果能连上,再检查Flask配置里的密码有没有特殊字符(比如@、#这类),如果有需要URL编码,比如@要写成%40。确认PostgreSQL服务状态
有时候服务没启动也会伪装成密码错误的报错,先检查服务是否在运行:- Linux:
systemctl status postgresql - Windows:打开服务管理器,找到PostgreSQL相关服务看是否处于运行状态
- Linux:
确认目标数据库已创建
注意db.create_all()是用来创建表的,不是创建数据库!你得先手动创建lexus数据库,可以用psql输入CREATE DATABASE lexus;,或者用pgAdmin图形界面创建。检查PostgreSQL监听地址
打开postgresql.conf文件,确认listen_addresses设置为'localhost'或者'*',如果设置成了特定IP,localhost可能无法连接。
我当时就是第一个原因导致的,改完认证模式重启服务就正常了,你可以一个个排查试试!
内容的提问来源于stack exchange,提问作者amars




