繁体   English   中英

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

[英]Correctly configuring a Postgres DB for a Rails 4.2 app on Heroku

我对如何在使用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

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

这个Heroku指南用于连接到Ruby的数据库,提到4.2之前的任何Rails应用程序都会被Heroku覆盖其database.yml文件。 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

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

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

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

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

这个Heroku指南说要为您的应用程序导出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

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

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

更新1:这就是我现在所知道的。 如果您部署到Heroku,无论您的Rails版本如何,都不需要在config/database.yml进行分段和生产配置。 在4.2之前,Heroku将根据DATABASE_URL环境变量的值生成它自己的database.yml文件,覆盖您的配置文件(如果存在)。 从Rails 4.2开始,您的应用程序将直接使用DATABASE_URL环境变量(绕过database.yml文件),因此Heroku不需要(也不会)生成配置文件。

我还想出了为什么我的开发和测试环境使用Heroku应用程序中的远程登台数据库而不是他们的database.yml配置中指定的本地database.yml 这是因为我的本地.env文件用于开发基于我的staging .env文件,该文件包含用于连接数据库的环境变量,例如DATABASE_URL 因为DATABASE_URL存在于我的开发.env文件中,我的Rails 4.2应用程序正在使用它,因此连接到登台DB。 为了解决这个问题,我从开发.env文件中删除了这些环境变量,并使用bundle exec rake db:setup创建了本地数据库(并运行了迁移)。

更新2: Rails指南的这一部分详细介绍了如何配置数据库,值得阅读: http//guides.rubyonrails.org/configuring.html#configuring-a-database

你的大多数假设都是正确的。 以下是一个合理的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环境以开发模式启动。

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

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

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

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

添加

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

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

要在没有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
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM