Rails中PostgreSQL密码存入ENV变量后出现PG::ConnectionBad fe_sendauth: no password supplied错误的排查求助
解决Rails连接PostgreSQL时"fe_sendauth: no password supplied"的问题
嘿,我一眼就看出问题出在哪了——你的pg_keys.yml文件里的环境变量根本没被Rails加载进来!所以database.yml里写的<%= ENV['PG_PASSWORD'] %>其实是空值,PostgreSQL自然就会提示你未提供密码了。
下面给你两种靠谱的解决办法,选哪种都能搞定:
方法一:手动让Rails加载你的YAML文件
- 进入项目的
config/initializers文件夹,新建一个叫load_pg_env.rb的文件(名字只要易懂就行) - 把这段代码粘贴进去,它会帮你把
pg_keys.yml里的内容读取到环境变量中:
require 'yaml' # 读取pg_keys.yml文件,注意路径要和你的文件实际位置对应 pg_config = YAML.load_file(Rails.root.join('pg_keys.yml')) pg_config.each do |key, value| ENV[key] = value unless ENV[key].present? end
划重点!一定要把
pg_keys.yml加到.gitignore里,绝对别把密码不小心提交到代码仓库了!
- 重启你的Rails服务器,再尝试连接数据库,应该就能正常运行了。
方法二:用dotenv gem管理环境变量(更推荐)
如果以后还要添加其他环境变量,用dotenv会更省心规范:
- 打开Gemfile,添加这一行代码:
gem 'dotenv-rails', groups: [:development, :test]
- 执行
bundle install安装这个gem - 在项目根目录新建一个
.env文件,把密码写入其中:
PG_PASSWORD=***********
- 同样要把
.env加到.gitignore里,保护好敏感信息 - 重启服务器后,
database.yml就能正常读取到ENV['PG_PASSWORD']了
最后提个醒
生产环境里绝对不要用文件存储密码!建议使用服务器提供的环境变量配置功能(比如云服务商控制台里的环境变量设置),这样安全性更高。
内容的提问来源于stack exchange,提问作者goodjobbin85
相关产品推荐
相关产品推荐

