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

时间:2015-02-13 20:06:42

标签: ruby-on-rails postgresql heroku ruby-on-rails-4.2

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

根据建议in this Heroku guide,您将得到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 connecting to the DB in Ruby提到在4.2 之前的任何Rails应用都会被Heroku覆盖database.yml个文件。 Heroku将解析DATABASE_URL环境变量并创建一个新的database.yml文件。

所以我想我可以在database.yml中省略你在Heroku上拥有的任何环境的配置,例如登台和制作。你的database.yml file could essentially look like Hound's(注意缺少生产配置)。

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上的登台数据库而不是本地数据库的那些环境。

This Heroku guide表示要导出应用程序的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

或者我们是否使用this Heroku guide中所示的配置(使用hostusername

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

更新1:这就是我现在所知道的。如果您部署到Heroku,则config/database.yml中不需要暂存和生产配置,无论您的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 个答案:

答案 0 :(得分: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'] %>

确保在Heroku上正确设置RAILS_ENVstagingproduction),否则Rails默认为development

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

答案 1 :(得分:3)

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

我现在正在开发一个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我没事。

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

答案 2 :(得分:2)

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

添加

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

使那些可能没有意识到但不会改变行为的人更明显地发生了什么。如果需要,configuring rails指南在database.yml和DATABASE_URL之间的交互中有更多信息。

答案 3 :(得分: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
)