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のみにできて欲しい。

うーむ、弱った。