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

How to configure database.yml for deployment to 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:

谢谢

在 yaml 中

<<: *default

这意味着您要将 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

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

本质上,"heroku's databases" 和您在此文件中定义的本地数据库完全不同。在本地和测试环境中使用 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]

希望这对您有所帮助..:)

我不知道这是否正是您想要的,但我自己花了一些时间来解决这个问题,所以我想我会 post 在这里。

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 的生产部分中的其他内容的条目将被忽略。所以你可以将它们留空,或者在你的开发机器上设置任何对你来说更方便的东西。

既然可以把ERB放在yml文件里,some sources建议你明确地把

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

在您的 database.yml 中明确将 url 设置为环境变量。这使得环境变量中的任何内容都意味着覆盖 yml 中的所有内容。