【问题标题】:RoR: how do I test my app against multiple databases?RoR:如何针对多个数据库测试我的应用程序?
【发布时间】:2011-07-16 01:21:37
【问题描述】:

我开始在Heroku 上部署我最新的 RoR 应用程序,这要求我开始使用 PostgreSQL——我之前一直在使用 SQLite 和 MySQL。我想要一种非常简单的方法来持续对所有三个数据库进行红/绿测试,以确保在开发过程中不会破坏任何东西。

有什么好的方法可以做到这一点?

【问题讨论】:

  • 这是一个有答案的问题(根据常见问题解答是合法的)。我认为其他人可能会觉得它很有用。
  • 不,问题部分是问题+答案。请在下面回答您自己的问题(“您的答案”)并接受该答案。这样,这将从未回答的队列中移出。谢谢!

标签: mysql ruby-on-rails sqlite postgresql rspec


【解决方案1】:

@awendt 好心地指出我可以回答我自己的问题。

原来配方相当简单。秘诀是使用环境变量告诉 Rails 你想使用哪个数据库。

1。修改文件

config/database.yml 中,包含这样的 ERB 结构:

test:
<% if (ENV["RAILS_DB"] == "PostgreSQL") %>
  adapter: postgresql
  encoding: unicode
  database: bd_test
  pool: 5
  username: <%= ENV['POSTGRESQL_USERNAME'] || 'root' %>
  password: <%= ENV['POSTGRESQL_PASSWORD'] || '' %>
<% elsif (ENV["RAILS_DB"] == "MySQL") %>
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: bd_test
  pool: 5
  username: <%= ENV['MYSQL_USERNAME'] || 'root' %>
  password: <%= ENV['MYSQL_PASSWORD'] || '' %>
  socket: <%= ENV['MYSQL_SOCKET'] || '/tmp/mysql.sock' %>
<% else %>
  # default to SQLite
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000
<% end %>

注 1:我只在测试环境中展示了它。事实上,这是我唯一修改的一个,因为(据说)它提供了足够的覆盖范围来告诉我是否正确支持所有三个数据库。

注意 2:您不需要使用环境变量来设置用户名和密码——这只是我更喜欢做的事情,因为它可以避免在常用文件中暴露密码。

类似地,将 Gemfile 扩展如下(请注意,您的版本号可能会有所不同):

source 'http://rubygems.org'
gem 'rails', '3.0.3'
case ENV["RAILS_DB"]
when "PostgreSQL"
  gem 'pg', '0.10.0'
when "MySQL"
  gem 'mysql2'
else
  gem 'sqlite3', '1.3.3'
  gem 'sqlite3-ruby', '1.3.3', :require => 'sqlite3'
end
...

2。为您的代码添加条件

尽管 Rails 开发团队尽了最大努力,但仍有一些地方 ActiveRecord 构造无法兼容所有类型的数据库。在这些情况下,您可以使用ActiveRecord::Base.connection.adapter_name 调整您的代码。这是我的一个迁移文件中的一个示例:

file: migrate/20110129023453_create_cached_web_pages.rb

def self.up
  create_table :cached_web_pages do |t|
    t.string    :key             
    if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
      t.binary    :value
    else
      t.binary    :value, :limit => 16777215
    end
  end
end
...

3。运行和测试

您现在可以简单地通过设置 RAILS_DB 环境变量来选择数据库,但有一个问题:您必须每次运行 bundle install 才能从 Gemfile 设置适当的数据库适配器。幸运的是,这正是测试代码所做的。因此,例如,我可以在两个窗口中运行 rspec 的自动测试:

$ RAILS_DB=SQLite autotest

$ RAILS_DB=PostgreSQL autotest

现在我可以破解我的文件,如果我在进行过程中破坏了任何东西,自动测试会悄悄地提醒我。

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2015-06-24
    • 2016-02-13
    • 1970-01-01
    • 2012-02-19
    • 2016-08-27
    • 2011-02-20
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多