如何配置database.yml以部署到Heroku

时间:2015-01-09 16:12:42

标签: ruby-on-rails database heroku

我最近升级到最新版本的Rails,我不明白如何将应用程序部署到Heroku。

这是我的database.yml文件

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

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

我之前从未在database.yml中看过这种语法。有谁知道如何配置?

它看起来与我习惯的有很多不同

development:
 adapter: mysql2
 encoding: utf8
 database: my_app_development
 pool: 5
 username: root
 password:

test:
 adapter: mysql2
 encoding: utf8
 database: my_app_test
 pool: 5
 username: root
 password:


production:
 adapter: mysql2
 encoding: utf8
 database: ymca_gym_production
 pool: 5
 username: root
 password:

由于

3 个答案:

答案 0 :(得分:2)

对于Heroku,你必须使用postgresql,因为它不支持mysql2。 Heroku有自己的机制来处理数据库,您可以在这里阅读更多信息:https://devcenter.heroku.com/articles/heroku-postgresql

基本上,对待&#34; heroku的数据库&#34;和您在此文件中定义的本地数据库完全不同。您可以更轻松地将sqlite用于本地和测试环境,对于生产,您应该将yaml代码更改为:

development:
 adapter: mysql2
 encoding: utf8
 database: my_app_development
 pool: 5
 username: root
 password:

test:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

production:
      adapter: postgresql
      database: my_database_production
      pool: 5
      timeout: 5000

上面的代码还不足以让它在heroku上运行,你还需要编辑下面的gemfile内容:

gem 'pg', :group => :production
gem 'mysql2' , :group => :development
gem 'sqlite3', :group => :test

我根据我编写的database.yaml代码制作了gemfile代码。您可以将mysql2用于开发和测试环境。如果您这样做,您可以更改gemfile内容,如下所示:

gem 'pg', :group => :production
gem 'mysql2' , :group => [:development, :test]

希望这会有所帮助.. :)

答案 1 :(得分:1)

我不知道这是不是你想要的,但我只花了一段时间自己弄清楚这一点,所以我想我会把它发布在这里。

ActiveRecord支持从环境变量DATABASE_URL和database.yml文件中获取数据库连接信息。在任何情况下使用哪一个都可能有点棘手。幸运的是,这已经基本上得到了解决 - 请参阅this拉取请求了解大多数细节。

简短版本是如果你的database.yml中没有url键,那么DATABASE_URL中的信息会自动覆盖database.yml,以便它可以设置URL中存在的所有内容,包括用户名,密码,服务器,端口,适配器和数据库名称。如果database.yml中有url键,则会覆盖DATABASE_URL env var以及它在database.yml条目中与之冲突的所有其他内容。

由于Heroku自动设置了一个完整的DATABASE_URL,基本上除了池和编码之外的所有内容都是从中获取的,并且忽略了database.yml的production部分中其他内容的条目。因此,您可以将它们留空,或者在开发机器上设置更方便的任何内容。

由于可以将ERB放入yml文件中,some sources建议您明确放置

production:
  url: <%= ENV['DATABASE_URL'] %>
在您的database.yml中

将url显式设置为env var。这使得更清楚的是env var中的任何内容都意味着覆盖yml中的所有内容。

答案 2 :(得分:0)

在yaml

<<: *default

这意味着您要将默认附加到该组,因此

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

development:
  <<: *default
  database: db/development.sqlite3

等于此

development:
  adapter: postgresql
  pool: 5
  timeout: 5000
  database: db/development.sqlite3