@awendt vui lòng chỉ ra rằng tôi có thể trả lời câu hỏi của riêng mình.
Nó chỉ ra công thức là khá đơn giản. Bí quyết là sử dụng một biến môi trường để cho Rails biết bạn muốn sử dụng db nào.
1. Sửa đổi tệp của bạn
Trong config/database.yml
, bao gồm các cấu trúc ERB như sau:
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 %>
Lưu ý 1:Tôi chỉ hiển thị nó cho môi trường thử nghiệm. Trên thực tế, đó là cơ sở duy nhất mà tôi đã sửa đổi, vì (được cho là) nó cung cấp đủ phạm vi để cho tôi biết liệu cả ba cơ sở dữ liệu có được hỗ trợ đúng cách hay không.
Lưu ý 2:Bạn không cần sử dụng các biến môi trường để đặt tên người dùng và mật khẩu - đó chỉ là điều tôi muốn làm vì nó tránh để lộ mật khẩu trong một tệp thường được xem.
Tương tự, hãy mở rộng Gemfile như sau (lưu ý rằng số phiên bản của bạn có thể thay đổi):
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. Thêm điều kiện vào mã của bạn
Bất chấp những nỗ lực tốt nhất của nhóm phát triển Rails, có một số điểm mà các cấu trúc ActiveRecord không tương thích trên tất cả các phiên bản của cơ sở dữ liệu. Trong những trường hợp này, bạn có thể điều chỉnh mã của mình trên ActiveRecord::Base.connection.adapter_name
. Đây là một ví dụ từ một trong các tệp di chuyển của tôi:
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. Đang chạy và thử nghiệm
Giờ đây, bạn có thể chọn cơ sở dữ liệu chỉ bằng cách đặt biến môi trường RAILS_DB, nhưng có một vấn đề:bạn phải chạy bundle install
mỗi lần để thiết lập bộ điều hợp cơ sở dữ liệu thích hợp từ Gemfile. May mắn thay, đó chính xác là những gì mã thử nghiệm làm. Vì vậy, ví dụ:tôi có thể chạy tính năng tự động kiểm tra của rspec trong hai cửa sổ:
$ RAILS_DB=SQLite autotest
và
$ RAILS_DB=PostgreSQL autotest
Giờ đây, tôi có thể lấy đi các tệp của mình và tính năng tự động kiểm tra sẽ âm thầm cảnh báo cho tôi nếu tôi đã làm hỏng bất kỳ thứ gì khi tôi tiếp tục.