无法访问“database.yml”文件中的环境变量

Posted

技术标签:

【中文标题】无法访问“database.yml”文件中的环境变量【英文标题】:Failing to access environment variables within `database.yml` file 【发布时间】:2012-01-30 22:55:04 【问题描述】:

我的development.yml 文件有以下开发部分:

development:
  adapter: postgresql
  host: localhost
  database: testtb
  username: app_user
  password: ENV['APP_USER_POSTGRES_PASSWORD']     <= Troublesome line

当我通过bundle exec rails console 打开rails 控制台并输入ENV['APP_USER_POSTGRES_PASSWORD'] 时,我会取回我在本地配置文件中指定的数据库密码。但是,当我启动我的 rails 服务器时,它无法连接到数据库,失败并显示

PGError FATAL:  password authentication failed for user "app_user"

当我实际上以纯文本形式输入数据库密码而不是尝试通过ENV['...'] 访问它时,这以前是有效的,但出于显而易见的原因,我希望将实际密码完全保留在此文件之外(因此代码存储库之外),同时仍然能够向database.yml 文件提交其他非安全更改。

我缺少的语法有什么特别之处,或者在加载database.yml 文件时环境变量由于某种原因不可用?

【问题讨论】:

您可能想查看有关配置和局部变量的指南:railsapps.github.io/rails-environment-variables.html tl;dnr: figaro gem 对此很有用。 @Antzi 请注意,根据 Figaro 的自述文件,Figaro 不支持 database.yml,因为它是在 figaro 配置之前读取的。 更新:Figaro 现在适用于所有 Rails 版本的 database.yml。 github.com/laserlemon/figaro/pull/100 【参考方案1】:

更新:有些人在 cmets 中报告说这个 doesn't work 从 Rails 4.2.x.x 开始。我自己没试过,所以YMMV。


啊,终于找到了简单的解决方案——它接受嵌入式 Ruby:

password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>

【讨论】:

天哪,你不知道我花了多长时间检查和仔细检查我的密码。谢谢!我想我应该记住 YAML 不是标记语言,但 erb 是。 @MikeH-R - 这正是我最终弄清楚这一点时的感受。 此解决方案在 Rails 4.2.5.1 的控制台中不起作用。它尝试发送整个字符串。 这是区分大小写的。 这不起作用,我尝试了大写和小写。几次。我不知道这里出了什么问题,我必须将其硬编码为 xxx.yml。【参考方案2】:

如果您运行的是 Rails 版本 > 4.2 的快速解决方案,请运行以下命令:

spring stop

..然后运行 ​​rails console 或其他 rails 命令。我的问题是需要重新启动 Spring 服务器才能刷新/获取我的新 ENV 变量。我正在启动 Rails 控制台,但在我关闭 Spring 之前它看不到它们。

以前的 Rails 版本没有这个问题,因为它们没有使用 Spring 服务器。

另一个帮助您排除故障的工具——使用以下命令打印出您的 database.yml 配置。你可以从命令行运行它,但我更喜欢在 Rails 控制台中运行它,因为你可以使用 awesome_print 让它变得漂亮:

rails console内:

puts ActiveRecord::Base.configurations

...或使用 awesome_print

ap ActiveRecord::Base.configurations

或者从命令行代替:

bin/rails runner 'puts ActiveRecord::Base.configurations'

【讨论】:

我不知道为什么有人会否决这个答案。这是完全有效的(也对我有用)+1 谢谢@Kroltan,人们有时会否决一个实际上帮助他人的有价值的问题,然后却不提供任何理由,这很烦人。我猜仇恨者会讨厌。但我很高兴这对您有所帮助。 我在使用 rails 控制台和 rails runner 时都遇到了问题,这完全是因为这个 spring 重置对于获取新的 env 变量是必要的!谢谢;) 所以每次部署一个版本时,是否需要停止这个春天来获取新的变量?

以上是关于无法访问“database.yml”文件中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在database.yml文件中设置rails环境变量?

如何使用 database.yml 为每个环境定义 json 文件

无法加载数据库配置。没有这样的文件 - database.yml - OpsWorks

Docker + Rails + MySQL =忽略database.yml中的环境变量

这个 database.yml 文件中的 &,<<, * 是啥意思?

database.yml 中的 pool 选项有啥用