カテゴリ:DBIC

2007-10-11 Thu


DBICの再接続 [DBIC]


http://d.hatena.ne.jp/sfujiwara/20071009/1191956562

なんかバージョンによって、挙動が違うらしい...



2007-03-27 Tue


DBIC で columns [DBIC]


O/R マッパーということで、基本的には、全部のカラムをひっぱってくるわけですが、ちょっと idとタイトルの一覧を表示するだけだから、全部ひっぱり出すのは、ちょっと勿体ないよねぇ…ってときは

my $articles = $schema->resultset('Article')->search(
    undef,
        { columns => [qw/ id title /] }
);


のようにすれば、カラムを指定してデータを取ってこれます。

ただし、

__PACKAGE__->many_to_many(
    'tags' => 'tagmap',
    'tag_id'
);


とか、リレーションを設定しているものにたいしては、うまく動きません。実際にやってみると

my $articles = $schema->resultset('Article')->search(
    undef,
    { columns => [qw/ id tags /] }

);




DBD::mysql::st execute failed: Unknown column 'me.tags' in 'field list' at /usr/share/perl5/DBIx/Class/Storage/DBI.pm line 782.
DBIx::Class::ResultSet::next(): Error executing 'SELECT me.id, me.tags FROM article me': Unknown column 'me.tags' in 'field list' at select.pl line 19


のようなメッセージを吐いて失敗します。忘れそうなので、メモ。というか普通になんか方法ありそうだけどねぇ(^_^;


2007-03-17 Sat


Schema 自動生成 [DBIC]


どこかのブログで見た方法(どこだかは忘れた……)

$ perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at "Hoge::Schema", {relationships=>1, debug=>1}, ["dbi:mysql:hogedb","root", "内緒"]'


とかすると、MySQL の DBから、スキーマの定義を

Hoge/Schema.pm
Hoge/Schema/テーブル名1.pm
Hoge/Schema/テーブル名2.pm


みたいな形で自動生成してくれます。MySQLで MyISAM を利用していると、外部キー制約? が設定できないので、relationship とはか取り出せない(そもそも設定できてないからあたり前)ですけど……


2007-01-19 Fri


DBIC で範囲指定 [DBIC]


期間指定で、データを抽出したい時、当初

my $articles = $schema->resultset('Article')->search(
                                                     {
                                                         created_on => {
                                                              '>' => "2006/01/01 00:00:00",
                                                         },
                                                         created_on => {
                                                             '<=' => "2006/01/05 23:59:59"
                                                         },
                                                     });


でいけるかと思ったんだけど、ダメ。最後のものしか有効にならない。そりゃそうか。

my $articles = $schema->resultset('Article')->search(
                                                     {
                                                         created_on => {
                                                             '>' => "2006/01/01 00:00:00",
                                                             '<=' => "2006/01/05 23:59:59"
                                                         },
                                                     });



とするか、もしくは

my $articles = $schema->resultset('Article')->search(
                                                     {
                                                         created_on => {
                                                             -BETWEEN => [
                                                             "$date 00:00:00",
                                                             "$date 23:59:59",
                                                             ]
                                                         },
                                                     });


が正しいみたい。後者の方が意味がはっきりするのでいいかな?

SELECT
    me.id, me.title, me.publish, me.body, me.created_on
FROM
    article me
WHERE
    ( created_on BETWEEN ? AND ? ): '2007-01-09 00:00:00', '2007-01-09 23:59:59'


こんな感じで SQL が発行されます。


2006-12-27 Wed


DBICのRの拡張 [DBIC]


DBICのRの拡張は、CDBI とはちょこっと違って気を付けないといけないらしい。

http://d.hatena.ne.jp/nekokak/20061227/1167210571

によると、ResultSetManagerを使うべし、とのこと。

ResultSetRegister の方がいいのかなぁ?

http://code.mfac.jp/trac/file/MoFedge-Data-DBIC-Schema/lib/MoFedge/Data/DBIC/ResultSetRegister.pm


2006-12-25 Mon


DBICの resultset_attributes [DBIC]


DBICの resultset_attributes を使うとデフォルトの検索条件とかソート条件を指定できる
http://d.hatena.ne.jp/nekokak/20061114/1163488553

へぇ〜これは便利!