我对如何在使用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_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指南中所示的配置(使用host
和username
)
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_ENV
(staging
或production
),否则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
)