在Heroku上为Rails 4.2应用程序正确配置Postgres DB



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

根据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

但当我尝试这样做时,我的开发和测试环境使用了与暂存环境相同的DB(请注意,该文件没有用于暂存的配置)。这不好。

这个用Ruby连接数据库的Heroku指南提到,4.2之前的任何Rails应用程序都会被Heroku覆盖其database.yml文件。Heroku将解析DATABASE_URL环境变量并创建一个新的database.yml文件。

所以我想,对于Heroku上的任何环境,比如登台和生产,都可以省略database.yml中的配置。您的database.yml文件可能基本上看起来像Hound的(请注意,缺少生产配置)。

development: &default
  adapter: postgresql
  encoding: unicode
  database: app_development
  pool: 5
test:
  <<: *default
  database: app_test

但由于我们使用的是Rails4.2,我认为Heroku不会覆盖database.yml文件。在这种情况下,您是否必须在database.yml中为我们在Heroku上的环境指定DB配置?还是把他们排除在外仍然安全?如果我们确实需要指定Heroku环境的配置,以下内容就足够了吗?

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

我还对开发和测试环境的正确配置感到困惑。如上所述,所示的第一个配置使用Heroku上的staging DB,而不是本地DB。

这个Heroku指南说,导出DATABASE_URL环境变量,让你的应用程序连接(一旦安装了Postgres,你就可以连接到它)。

假设您按照文章中的指定导出DATABASE_URLenv-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应用程序中的远程暂存DB,而不是database.yml配置中指定的本地DB。这是因为我用于开发的本地.env文件基于我的暂存.env文件,该文件包含用于连接到数据库(如DATABASE_URL)的环境变量。因为DATABASE_URL存在于我的开发.env文件中,所以我的Rails 4.2应用程序正在使用它,从而连接到暂存数据库。为了解决这个问题,我从开发.env文件中删除了这些环境变量,并使用bundle exec rake db:setup创建了本地DB(并运行了迁移)。

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

您的大多数假设都是正确的。以下是一个合理的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中。原因是,不同机器上的数据库可能不同,这也是不保持配置通用的原因。

我现在正在做一个Rails4.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上创建数据库.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
)

最新更新