我对如何在使用Postgres和Heroku的Rails 4.2应用程序中配置数据库感到困惑。
根据建议in this Heroku guide,您将得到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 guide for connecting to the DB in Ruby提到在4.2 之前的任何Rails应用都会被Heroku覆盖database.yml
个文件。 Heroku将解析DATABASE_URL
环境变量并创建一个新的database.yml
文件。
所以我想我可以在database.yml
中省略你在Heroku上拥有的任何环境的配置,例如登台和制作。你的database.yml
file could essentially look like Hound's(注意缺少生产配置)。
development: &default
adapter: postgresql
encoding: unicode
database: app_development
pool: 5
test:
<<: *default
database: app_test
但是由于我们使用的是Rails 4.2,我认为Heroku不会覆盖database.yml
文件。在这种情况下,您是否必须在database.yml
中为Heroku上的环境指定数据库配置?或者将它们排除在外仍然是安全的吗?如果我们确实需要为Heroku环境指定配置,那么以下内容是否足够?
staging:
url: <%= ENV['DATABASE_URL'] %>
production:
url: <%= ENV['DATABASE_URL'] %>
我也对开发和测试环境的正确配置感到困惑。如上所述,显示的第一个配置包含使用Heroku上的登台数据库而不是本地数据库的那些环境。
This Heroku guide表示要导出应用程序的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
或者我们是否使用this Heroku guide中所示的配置(使用host
和username
)
development:
adapter: postgresql
host: localhost
username: user
database: app-dev
更新1:这就是我现在所知道的。如果您部署到Heroku,则config/database.yml
中不需要暂存和生产配置,无论您的Rails版本如何。在4.2之前,Heroku将根据database.yml
环境变量的值生成自己的DATABASE_URL
文件,覆盖配置文件(如果存在)。从Rails 4.2开始,您的应用将直接使用DATABASE_URL
环境变量(绕过database.yml
文件),因此Heroku不需要(也不会)生成配置文件。
我还想出了为什么我的开发和测试环境使用Heroku应用程序中的远程登台数据库而不是database.yml
配置中指定的本地数据库。这是因为我的本地.env
开发文件基于我的暂存.env
文件,该文件包含用于连接到数据库的环境变量,例如DATABASE_URL
。由于我的开发DATABASE_URL
文件中存在.env
,因此我的Rails 4.2应用程序正在使用它,从而连接到登台数据库。为了解决这个问题,我从开发.env
文件中删除了这些环境变量,并使用bundle exec rake db:setup
创建了本地数据库(并运行了迁移)。
更新2: Rails指南的这一部分详细介绍了如何配置数据库,值得一读:http://guides.rubyonrails.org/configuring.html#configuring-a-database
答案 0 :(得分:3)
您的大部分假设都是正确的。以下是合理的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
环境以开发模式启动。
答案 1 :(得分:3)
事实上,许多开发人员选择忽略版本控制中的database.yml
,并且永远不会将其发布到回购中。原因是,不同机器上的数据库可能不同,这是不保持配置通用的原因。
我现在正在开发一个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
我没事。
因此,您在第一个指南中显示的配置是合理的:它包含最少量的设置,并允许您轻松创建更多环境。
答案 2 :(得分:2)
Heroku不会在rails 4.2上创建database.yml,因为从该版本开始,rails将检测该环境变量的存在并使用它来配置数据库连接。
添加
production:
url: <%= ENV['DATABASE_URL'] %>
使那些可能没有意识到但不会改变行为的人更明显地发生了什么。如果需要,configuring rails指南在database.yml和DATABASE_URL之间的交互中有更多信息。
答案 3 :(得分:0)
在没有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
)