@ 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
Теперь я могу взломать мои файлы, и автотест тихо предупредит меня, если я 'Я сломал что-нибудь, пока я иду вперед.