我对如何在使用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文件。
因此,我想可以省略database.yml中的配置,用于Heroku上的任何环境,比如暂存和生产。您的文件从本质上看就像猎犬的 (注意缺乏生产配置)。
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上的环境指定DB配置吗?还是把他们排除在外还是安全的?如果我们确实需要为Heroku环境指定配置,那么以下内容是否就足够了?
staging:
url: <%= ENV['DATABASE_URL'] %>
production:
url: <%= ENV['DATABASE_URL'] %>我还对开发和测试环境的适当配置感到困惑。如前所述,第一个配置使用Heroku上的暂存DB,而不是本地DB。
这个Heroku指南说要导出DATABASE_URL环境变量,以便应用程序连接(一旦安装了Postgres,您就可以连接到它)。
假设您导出了本文中指定的DATABASE_URL env,那么用于开发和测试的配置应该是什么样的呢?我们是否按照第一个指南中所示的配置进行操作?
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.yml环境变量的值生成自己的DATABASE_URL文件,覆盖配置文件(如果存在的话)。从Rails 4.2开始,应用程序将直接使用DATABASE_URL环境变量(绕过database.yml文件),因此Heroku不需要(也不会)生成配置文件。
我还了解了为什么我的开发和测试环境使用来自Heroku应用程序的远程暂存DB,而不是在其database.yml配置中指定的本地DB。这是因为我用于开发的本地.env文件是基于我的暂存.env文件,该文件包含用于连接到数据库(如DATABASE_URL )的环境变量。因为DATABASE_URL存在于我的开发.env文件中,所以我的Rails 4.2应用程序正在使用它,从而连接到暂存DB。为了解决这个问题,我从开发.env文件中删除了这些环境变量,并使用bundle exec rake db:setup创建了本地DB(并运行迁移)。
更新2:这部分Rails指南将详细介绍如何配置DB,值得一读:http://guides.rubyonrails.org/configuring.html#configuring-a-database
发布于 2015-02-13 20:14:18
你的大部分假设都是正确的。下面是一个合理的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 ( staging或production)上正确设置了Rails,否则Rails将默认为development。
在本地,测试将选择test环境。默认情况下,应用程序将使用development环境以开发模式启动。
发布于 2015-02-13 21:15:23
事实上,许多开发人员选择忽略版本控制中的( 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我就没事了。
因此,您所称的“第一个指南中所示”的配置是合理的:它包含最小数量的设置,并允许您很容易地创建更多的环境。
发布于 2015-02-13 21:13:57
Heroku没有在rails上创建database.yml 4.2,因为从该版本起,rails将检测到该环境变量的存在,并使用它配置数据库连接。
添加
production:
url: <%= ENV['DATABASE_URL'] %>对于那些可能没有意识到但不会改变行为的人来说,这让事情变得更加明显了。如果需要的话,配置rails指南提供了关于database.yml和DATABASE_URL之间交互的更多信息。
https://stackoverflow.com/questions/28507881
复制相似问题