@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
现在我可以破解我的文件,如果我在进行过程中破坏了任何东西,自动测试会悄悄地提醒我。