【问题标题】:How to configure database.yml for deployment to Heroku如何配置 database.yml 以部署到 Heroku
【发布时间】:2015-03-08 00:25:52
【问题描述】:

我最近升级到最新版本的 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:

谢谢

【问题讨论】:

    标签: ruby-on-rails database heroku


    【解决方案1】:

    我不知道这是否正是你想要的,但我自己花了一段时间才弄清楚,所以我想我会把它贴在这里。

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

    简短的版本是,如果你的 database.yml 中没有 url 键,那么DATABASE_URL 中的信息会自动覆盖 database.yml 中它可以设置的所有内容,包括用户名,密码、服务器、端口、适配器和数据库名称。如果 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 显式设置为 env var。这更清楚地表明,env var 中的任何内容都旨在覆盖 yml 中的所有内容。

    【讨论】:

      【解决方案2】:

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

      本质上,将“heroku 的数据库”和您在此文件中定义的本地数据库完全不同。您可以更轻松地将 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]
      

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

      【讨论】:

      • “在本地和测试环境中使用 sqlite 会更容易”是个坏建议。两者之间存在细微差别(即 PG 字符串列长度限制),只有在将应用程序部署到 other 环境后才会发现。您通常希望您的开发环境尽可能接近您的生产环境,以避免 它在我的机器上运行 类错误。
      • 我自己在所有环境中都使用 PostgreSQL。我这么说是因为大多数人更喜欢使用 sqlite3,因为它简单且重量轻。 :)
      【解决方案3】:

      在 yaml 中

      &lt;&lt;: *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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-06
        • 2015-09-15
        • 2021-04-24
        • 2019-05-22
        • 2011-06-18
        • 2021-04-23
        • 2017-09-21
        • 2014-07-09
        相关资源
        最近更新 更多