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

Posted

技术标签:

【中文标题】如何在 database.yml 文件中设置 rails 环境变量?【英文标题】:How to set rails environment variables in database.yml file? 【发布时间】:2016-08-25 04:48:44 【问题描述】:

在我的本地机器上,我想为 database.yml 文件中的所有敏感信息设置环境变量。我的文件如下所示:

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: <%= ENV['DATABASE_USERNAME'] %> 
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: <%= ENV['SOCKET'] %>

development:
  <<: *default
  database: <%= ENV['DEVELOPMENT_DATABASE'] %>

test:
  <<: *default
  database: #JetStreamIQ-2_0_test

production:
  <<: *default
  database: <%= ENV['PRODUCTION_DATABASE'] %>
  username: <%= ENV['DATABASE_USERNAME'] %> 
  password: <%= ENV['DATABASE_PASSWORD'] %>

我以为我可以在我的 .bashrc 文件中设置这些环境变量,但这似乎不起作用。我的 .bashrc 文件如下所示:

export DATABASE_USERNAME="root"
export DATABASE_PASSWORD="*****"
export SOCKET="/var/run/mysqld/mysqld.sock"
export DEVELOPMENT_DATABASE="shoppe_development"
export PRODUCTION_DATABASE="#"

当我使用

运行我的服务器时
rails s

我收到一条错误消息:

Access denied for user 'root'@'localhost' (using password: YES)

我了解数据库用户名和密码存在问题,因为我配置了 database.yml 文件的方式,但我不确定它是什么。

我在这里缺少什么重要的东西吗?任何帮助将非常感激。

谢谢!

【问题讨论】:

【参考方案1】:

这是一个错字还是你真的设置了JETSTREAMIQ_DATABASE_PASSWORD,然后在你的database.yml 中使用了DATABASE_PASSWORD?因为那样就可以了。

你可以直接使用mysql命令行应用程序使用实际值连接到mysql吗?

【讨论】:

不,那是错字;抱歉,我刚刚编辑了我的帖子。是的,如果我在使用 mysql 命令行时简单地输入它们,我可以连接到我的 bashrc 文件中的值。【参考方案2】:

我想在这里提供一些提示。

    你可以通过 erb 运行 database.yml 来测试你得到了什么。例如,erb config/database.yml。这将帮助您确定问题所在。

    您可以使用set 命令找出在您的shell 中设置的每个环境变量。这将允许您确认正在设置您期望的环境变量(在 .bashrc 中)。

希望这有帮助。

【讨论】:

使用 'erb config/database.yml' 命令是一个很酷的技巧。我不知道你能做到这一点。当我运行该命令时,它显示我定义环境变量的所有字段都是空的。【参考方案3】:

事实证明,在我编辑了我的 bashrc 文件后,我需要退出该终端会话并打开另一个终端以完成更改:/ 之后我的应用程序完美启动。

【讨论】:

你是对的 - .bashrc 仅在您登录时加载,因此启动新的终端会话是查看更改的一种方式。或者,您可以通过 . .bashrc 加载文件,而无需重新启动会话。 或简单的source ~/.bashrc【参考方案4】:

如果你不想重启你的终端,你只需要执行你的 .bashrc 文件:

source /path/to/.bashrc

在与您的 Rails 服务器相同的终端中。

【讨论】:

【参考方案5】:

您可能需要将环境变量放在.bashrc 文件的顶部。因为它在文件中执行了一些返回。所以它在实际执行你的 export 命令之前返回

类似这样的:

纳米~/.bashrc

export DATABASE_VAR="my_own_var"

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

【讨论】:

【参考方案6】:

您还可以在终端上使用以下命令获取您的 ~/.bashrc 文件:

exec $SHELL

【讨论】:

【参考方案7】:

您是否尝试使用控制台中的数据访问本地数据库? 也许您必须授予 localhost 的访问权限

GRANT ALL ON shoppe_development.* TO 'root'@'localhost';

除此之外,我推荐你使用 gem dotenv 来处理你的环境变量以用于开发环境

【讨论】:

【参考方案8】:

只需设置环境变量

DATABASE_URL=postgres://user:pass@localhost/dbname

它将覆盖database.yml 设置

当然它支持更多的参数,比如

DATABASE_URL=mysql2://user:passwd@host:port/dbname?encoding=utf8mb4&collation=utf8mb4_unicode_ci

【讨论】:

以上是关于如何在 database.yml 文件中设置 rails 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hypersql 数据库(HSQLDB)中设置 Rank 函数

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

如何使用 webpack 在项目中设置多个文件输入和输出?

如何在 INI 配置文件中设置布尔值?

如何在 Nuxt 配置中设置 .env 文件路径?

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