はちゅにっき

こっちのブログはまったり更新

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


以下は全部失敗編

とりあえず、全部に PGOPTION をぶちこむ

  • lib/MyApp/Model/DBIC.pm とかとかとか
$ENV{'PGOPTION'} = '-c my_schema'

はい、ダメ。

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 にも入部したし、そっちに書いたほうがよかったのかな。。。
って、あっちはもっと、ぷろふぇっしょなる な内容じゃないとダメか。。。