Home > article > RailsでMySQLとPostgreSQLを同時に扱う方法(+問題点)

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

うーむ、弱った。

Comments:1

hiroshi 09-07-31 (Fri) 21:25

半年以上昔の記事へのコメントなので解決済みかもしれません + 小汚いので恐縮ですが、
migration file の中で
if ActiveRecord::Base.connection.adapter_name == “PostgreSQL”

end
ということじゃないですよね。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://ukstudio.jp/2008/10/04/rails_many_db/trackback/
Listed below are links to weblogs that reference
RailsでMySQLとPostgreSQLを同時に扱う方法(+問題点) from UKSTUDIO

Home > article > RailsでMySQLとPostgreSQLを同時に扱う方法(+問題点)

Feeds
Meta
Others

Return to page top