正确配置Heroku上的Rails 4.2应用程序的Postgres数据库

Den*_*nis 5 postgresql ruby-on-rails heroku ruby-on-rails-4.2

我对如何在使用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
Run Code Online (Sandbox Code Playgroud)

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

这个Heroku指南用于连接到Ruby的数据库,提到4.2之前的任何Rails应用程序都会database.yml被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
Run Code Online (Sandbox Code Playgroud)

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

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

production:
  url: <%= ENV['DATABASE_URL'] %>
Run Code Online (Sandbox Code Playgroud)

我也对开发和测试环境的正确配置感到困惑.如上所述,显示的第一个配置包含使用Heroku上的登台数据库而不是本地数据库的环境.

这个Heroku指南说要导出DATABASE_URL你的app连接的环境变量(一旦安装了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
Run Code Online (Sandbox Code Playgroud)

或者我们使用Heroku指南中所示的配置(使用hostusername)

development:
  adapter: postgresql
  host: localhost
  username: user
  database: app-dev
Run Code Online (Sandbox Code Playgroud)

更新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

Sim*_*tti 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'] %>
Run Code Online (Sandbox Code Playgroud)

确保RAILS_ENVHeroku 上的 已正确设置( 或stagingproduction,否则 Rails 将默认为development

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