5

我对如何在使用 Postgres 和 Heroku 的 Rails 4.2 应用程序中配置数据库感到困惑。

按照这个 Heroku 指南中的建议,你会得到config/database.yml这样的:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

production:
  <<: *default
  database: app_name_production

但是当我尝试这个时,我的开发和测试环境使用与登台环境相同的数据库(注意该文件没有登台配置)。那不好。

这个Heroku guide for connection to the DB in Ruby提到任何4.2 之前database.yml的 Rails 应用程序都会被 Heroku 覆盖它们的文件。Heroku 将解析DATABASE_URL环境变量并创建一个新database.yml文件。

因此,我想database.yml对于 Heroku 上的任何环境(例如登台和生产),都可以省略配置。您的database.yml文件本质上可能看起来像 Hound 的(注意缺少生产配置)。

development: &default
  adapter: postgresql
  encoding: unicode
  database: app_development
  pool: 5

test:
  <<: *default
  database: app_test

但由于我们使用的是 Rails 4.2,我认为 Heroku 不会覆盖该database.yml文件。在这种情况下,您是否必须database.yml在 Heroku 上为我们的环境指定数据库配置?或者将它们排除在外仍然安全吗?如果我们确实需要为 Heroku 环境指定配置,那么以下内容就足够了吗?

staging:
  url: <%= ENV['DATABASE_URL'] %>

production:
  url: <%= ENV['DATABASE_URL'] %>

我也对开发和测试环境的正确配置感到困惑。正如我上面提到的,显示的第一个配置具有使用 Heroku 上的暂存数据库而不是本地数据库的环境。

这个 Heroku 指南说要为您的应用程序导出DATABASE_URL环境变量以进行连接(一旦安装了 Postgres 并且您可以连接到它)。

假设您DATABASE_URL按照文章中的说明导出 env var,那么您的开发和测试配置必须是什么样的?我们是否使用第一个指南中所示的配置,例如

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

或者我们是否使用本 Heroku 指南中所示的配置(使用hostand username

development:
  adapter: postgresql
  host: localhost
  username: user
  database: app-dev

更新1:这就是我现在所知道的。config/database.yml如果您部署到 Heroku,无论您的 Rails 版本如何,都不需要登台和生产配置。在 4.2 之前,Heroku 会database.yml根据DATABASE_URL环境变量的值生成它自己的文件,覆盖你的配置文件(如果它存在的话)。从 Rails 4.2 开始,您的应用程序将DATABASE_URL直接使用环境变量(绕过database.yml文件),因此 Heroku 不需要(也不会)生成配置文件。

我还弄清楚了为什么我的开发和测试环境使用 Heroku 应用程序中的远程暂存数据库,而不是在其database.yml配置中指定的本地数据库。这是因为我的本地.env开发文件基于我的暂存.env文件,其中包含用于连接到数据库的环境变量,例如DATABASE_URL. 因为DATABASE_URL存在于我的开发.env文件中,所以我的 Rails 4.2 应用程序正在使用它并因此连接到暂存数据库。为了修复它,我从开发.env文件中删除了这些环境变量,并使用bundle exec rake db:setup.

更新 2: Rails 指南的这一部分更详细地介绍了如何配置数据库,值得一读: http: //guides.rubyonrails.org/configuring.html#configuring-a-database

4

4 回答 4

3

你的大部分假设都是正确的。下面是一个合理的database.yml配置文件。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

staging:
  url: <%= ENV['DATABASE_URL'] %>

production:
  url: <%= ENV['DATABASE_URL'] %>

确保RAILS_ENV在 Heroku 上正确设置了 (stagingproduction),否则 Rails 将默认为development.

在本地,测试将选择test环境。默认情况下,应用程序将以开发模式启动,使用development环境。

于 2015-02-13T20:14:18.023 回答
3

事实上,许多开发人员选择忽略版本控制,从不将其database.yml发布到 repo 中。原因是,不同机器上的数据库可能不同,这是不保持配置通用的原因。

我现在正在做一个 Rails 4.2 项目,Heroku 完全没有问题database.yml(PostgreSQL 和 MySQL,我们都测试过)。为什么?因为DATABASE_URL提供了访问数据库所需的所有信息,甚至适配器名称。如何?这是公式:

adapter://username:password@hostname:port/database?options

在本地,我使用带有对等身份验证的 Postgres:数据库服务器假定我在我的操作系统中使用的相同用户名,username被覆盖,password没用。当没有给出时假定本地机器host,虽然我不知道它是否尝试通过 TCP/IP 或 Unix 域套接字进行通信,所以没有host.

因此,您所说的“在第一个指南中显示”的配置是合理的:它包含最少的设置,并允许您轻松创建更多环境。

于 2015-02-13T21:15:23.817 回答
2

Heroku 不会在 rails 4.2 上创建 database.yml,因为从该版本开始,rails 将检测该环境变量的存在并使用它来配置数据库连接。

添加

production:
  url: <%= ENV['DATABASE_URL'] %>

让那些可能不知道但不会改变行为的人更清楚正在发生的事情。如果需要,配置 rails指南会提供有关 database.yml 和 DATABASE_URL 之间交互的更多信息。

于 2015-02-13T21:13:57.130 回答
0

要在没有 Rails 的情况下连接 ActiveRecord(例如 sinatra):

url = URI.parse(ENV['DATABASE_URL'])
ActiveRecord::Base.establish_connection(
  encoding: 'unicode',
  pool: 5,
  timeout: 5000,
  reconnect: true,
  adapter: url.scheme,
  host: url.host,
  database: url.path.sub(%r{^/}, ''),
  username: url.user,
  password: url.password
)
于 2017-03-03T05:37:27.267 回答