RailsでMySQLとPostgreSQLを同時に扱う方法(+問題点)
プラグインとか無しで、複数のDB(MySQLとPostgreSQL)を扱う方法。Rails2.1でしか試してないけど、多分1.2とかでも大丈夫。多分。MySQLとPostgreSQLの接続ライブラリはgemからインストールしておくこと。
まずは、database.ymlに扱うデータベースの定義を書く。
development:
adapter: mysql
encoding: utf8
database: db_development
username: root
password:
test:
(面倒だから略)
production:
(面倒だから略)
psql_development:
adapter: postgres
encoding: utf8
database: ma2_mcd
username: root
password:
psql_test:
(面倒だから略)
psql_production:
(面倒だから略)
次にPostgreSQLに接続させたいモデルを編集する。例えば、ProfileモデルはPostgreSQLの方に接続させたい場合は以下のようになる。
class Profile < ActiveRecord::Base
establish_connection("psql_#{RAILS_ENV}".to_sym)
end
establish_connectionにシンボルでdatabase.ymlの定義を渡せば、そのモデルはその定義のデータベースに接続する。本番、テスト、開発でそれぞれ定義が違うだろうから、RAILS_ENVで今起動している環境の定義を呼び出すようにしてやる。
追記
上記の設定で一応アプリは動作するけど、いくつか問題点があるのでそれをメモしておく。マイグレーションの使い分けはどうする
例えば、db/migrateにcreate_hoge_for_psql.rb(数値は略)とcreate_foo_for_mysql.rbと合った場合、それをどう実行するかが問題になってくる。普通にrake db:migrateやrake db:migrate RAILS_ENV=psql_developmentとやったら、hogeとfooが両方とも作られてしまう。こちらとして望んでるのは、hogeがPostgreSQLのみ、fooがMySQLのみにできて欲しい。
うーむ、弱った。