Postgres のスキーマを指定して DBIC を設定したい
スキーマを独自に設定してある Postgres のデータベースを使う場合、特殊なこと、たとえば psql でシェルを立ち上げた後に
mydb=> SET search_path TO my_schema;
とか入力したり、環境変数 PGOPTIONS に
export PGOPTIONS='-c search_path=my_schema'
とか設定したりしないといけないですよね。
そうしないと、検索とかで
SELECT id from my_schema.id_list; -- スキーマ名をわざわざ入力しなきゃダメ!
とか、メンドクサイことしなきゃならないですよね。
で、そんな DB で Catalyst::Model::DBIC::Schema を使おうとしたら、search_path の通し方がわかんなくて、なんかだいぶ苦労したのでメモ。
結論から書くと、 DBIx::Class::Schema::Loader を継承しているクラスにちょっと書き込めばいいみたい。
- lib/MyApp/Model/Schema.pm
package MyApp::Model::Schema; use base qw( DBIx::Class::Schema::Loader ); __PACKAGE__->loader_options( db_schema => 'my_schema', # ここに書いた! ); 1;
分かってしまえばあまりにもカンタンすぎて「なんでこんなに迷ってたんだ。。。すっごい遠回りしたな!」ってびっくりしたけれど。
他にも利用できるオプションがドキュメントに載ってました。
なんで気づかなかったんだー。
http://search.cpan.org/~ilmari/DBIx-Class-Schema-Loader-0.04005/lib/DBIx/Class/Schema/Loader/Base.pm
以下は全部失敗編
on_connect_do にすがってみる
__PACKAGE__->config( schema_class => 'MyApp::Model::Schema', connect_info => [ 'dbi:Pg:dbname=mydb', 'user', 'passwd', ], { on_connect_do => ['SET search_path TO my_schema'], }, );
はい、ダメ。
'-c search_path=my_schema' (に相当するもの) を思い当たるところに全部書いてみる
__PACKAGE__->config( schema_class => 'MyApp::Model::Schema', connect_info => [ 'dbi:Pg:dbname=mydb', 'user', 'passwd', ], { search_path => 'my_schema', }, );
などなど。。。
ダメどころか、起動すらしないね!
わーい。
と、こんなことをずーっとやっていましたが、そもそも Catalyst::Model::DBIC::Schema でなんとかしようってゆーのが間違ってるんじゃないのか?
と思って、DBIx::Class::Schema::Loader の方にあたってみたら、すぐに分かりました。
なんてこったい。
あ、Hatena::Group::Catalyst にも入部したし、そっちに書いたほうがよかったのかな。。。
って、あっちはもっと、ぷろふぇっしょなる な内容じゃないとダメか。。。