RuntimeWarning数据库'default'迁移历史校验报错该如何解决?
数据库迁移
fe_sendauth: no password supplied报错解决方案 错误成因
该报错是PostgreSQL数据库专属的连接凭证错误,触发逻辑及附带No changes detected输出的原因如下:
- 本质原因:迁移工具执行前需要先连接
default配置对应的数据库,校验本地迁移文件与数据库中存储的迁移历史是否一致,此时连接请求没有携带合法的密码凭证,被PostgreSQL服务端拒绝,触发对应警告 - 具体触发场景:
- 项目数据库配置文件中
default连接的PASSWORD配置项漏写,或赋值为空 - 密码通过环境变量注入时,运行迁移命令的shell环境未加载对应环境变量,或环境变量名拼写错误导致读取到空值
- 运行迁移时误加载了生产/测试环境的配置,这类环境的数据库密码一般是专属环境变量,本地开发环境没有对应值
- PostgreSQL的
pg_hba.conf配置中将你当前连接的IP/用户的认证规则设置为password/md5/scram-sha-256,强制要求密码验证,无密码请求会被直接拦截
- 项目数据库配置文件中
- 附带
No changes detected说明:迁移历史校验环节先于模型变更检测执行,校验失败后工具直接终止后续流程,不会实际检测模型是否有变更,该输出不代表真的没有待迁移的变更。
排查与解决方法
- 校验本地数据库配置:找到项目的数据库配置文件(比如Django的
settings.py、Flask的config.py),确认default连接的PASSWORD字段已配置正确值,参考Django的合法配置示例:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的数据库名', 'USER': '你的数据库用户名', 'PASSWORD': '你的数据库密码', 'HOST': '127.0.0.1', 'PORT': '5432', } }
- 验证环境变量加载状态:如果密码是从环境变量读取(比如
os.getenv('DB_PASSWORD')),运行迁移前先在当前shell执行对应命令验证变量值:- Linux/macOS执行:
echo $DB_PASSWORD - Windows cmd执行:
echo %DB_PASSWORD%
若输出为空,先执行导出操作再运行迁移,比如Linux/macOS下执行export DB_PASSWORD=你的真实数据库密码
- Linux/macOS执行:
- 确认配置加载路径:运行迁移时指定对应的环境配置,避免误加载其他环境的配置,比如Django可通过参数指定配置文件:
python manage.py migrate --settings=项目名.settings.local - 直连排查数据库问题:用psql客户端尝试用相同的连接信息直连数据库,验证账号密码是否有效:
psql -h 数据库地址 -p 端口 -U 用户名 数据库名,按提示输入密码后如果依然连接失败,说明账号密码本身错误,或者你的IP不在数据库白名单内 - 开发环境临时适配:如果是本地开发场景,可修改PostgreSQL的
pg_hba.conf配置,将本地连接的认证方式改为trust(仅允许开发环境使用,生产环境严禁该配置),修改后重启PostgreSQL服务即可免密码连接本地数据库。
内容的提问来源于stack exchange,提问作者emmanuel odor
相关产品推荐
相关产品推荐

