トップ 追記

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|
Perl関連 | 今月のAcme | どんぞこ日誌のRSS

■2010-03-08

* [Perl] DBIx::Skinnyに色々機能を追加してみる 〜 DBIC_TRACEみたいなものB!

  DBIx::Skinnyでは、環境変数SKINNY_PROFILEに真値を渡せばプロファイラにSQLステートメントとバインド値が記録されます。ただし、実際にデータを確認するには手動で出力しないといけないのと、どんなタイミングで発行されたかがわかりません。でもデバッグしていると発行時に即データがみたいことがあります。なので、それ用のプロファイラを。

 package Your::Model;
 use DBIx::Skinny::Profiler::ProfileLogger;
 use DBIx::Skinny setup => +{
     dsn => 'dbi:SQLite:',
     username => '',
     password => '',
     profiler => DBIx::Skinny::Profiler::ProfileLogger->new,
 };

セットアプ後なら:

 my $skinny = Your::Model->new;
 $skinny->attribute->{ profiler } = DBIx::Skinny::Profiler::ProfileLogger->new;

  デフォルトでSTDERRに出力します。1=/path/to/fileのようにすると、DBIC_TRACE同様、ファイルに吐き出します。 p5-dbix-skinny-profiler-profilelogger

* [Perl] DBIx::Skinnyに色々機能を追加してみる 〜 ネストしたトランザクションB!

  DBIx::Skinnyは下記のようなネストしたトランザクションを扱いません。でも使えると便利なこともあるのでtxn_*メソッドが対応できるようにするモジュールを作ってみました。

    package Your::Model;
    use DBIx::Skinny;
    use DBIx::Skinny::Plus::NestedTransaction;
    #
    #
    {
        my $txn = Your::Model->txn_scope;
        {
            my $txn_sub = Your::Model->txn_scope;
            ...
        }
        ...
    }

  おまけの機能として、SKINNY_PROFILEをonにしてるとprofilerにBEGIN WORKとかCOMMITとかを渡します。 ←取り込んでもらえました。 p5-dbix-skinny-plus-nestedtxn

* [Perl] DBIx::Skinnyに色々機能を追加してみる 〜 複数主キーB!

  DBIx::Skinnyは単一のプライマリキーを前提としています。あまり複数プライマリキーは良くないと言われますし、作者のnekokakさんに聞いたら必要としなかったということでしたので、これはこれで割り切ってしまうのが良いのでしょう。ただそれでも、何かの事情で複数キーを設定している所でもDBIx::Skinnyを使いたいこともあるかもしれません。
  そこで複数に対応させようとソースを見たところ、pkに設定した値が利用されるのは、insertとfetchした後のRowクラスにおけるupdate、deleteだけのようです。さらにinsertで使うのは、serialやauto_incrementで自動生成されたidを設定するためでした。なので、Rowクラスにあるupdate、delete時に自動でプライマリキーを設定する部分だけを対応させればよいようです。で、つくったのがDBIx::Skinny::Plus::MultiPK。

 pakcage Your::Model;
 use DBIx::Skinny setup => +{
     dsn => 'dbi:SQLite:',
     username => '',
     password => '',
 };
 use DBIx::Skinny::Plus::MultiPK;
 
 # ...
 
 package Your::Model::Schema;
 
 install_table 'a_multi_pk_table' => schema {
     pk [ qw( id_a id_b ) ];
     columns qw( id_a id_b etc );
 };

 use DBIx::Skinnyの後で呼び出して、後はSchema内のpkにリストリファレンスでキーを渡すだけです。DBIx::Skinny::Row::_update_or_delete_condを上書きするという行儀よくない動作ですが、その辺の見直しは今後の課題。ついでにDBIx::Skinny::Row::get_columnsも上書きしています。これは、pkにリファレンスを渡す結果、insertした時にARRAY(0xa0a9d30)みたいなカラムが設定されてしまうのでget_columnsするときに取り除くため。 p5-dbix-skinny-plus-multipk

追記:コメントにありますように、本家に取り込んでもらいました。

本日のツッコミ(全2件) [ツッコミを入れる]

_ nekokak [multi pk supportをSkinny本体にとりこんでみました。 http://github.com/ne..]

_ まかまか [すいません、コメントがspamフィルタにかかってました。ありがとうございます!]

[]

■2010-03-03

* [Perl] DBIx::SkinnyをDBIx::Classな感じで使うB!

  DBIx::Classに慣れた人がDBIx::Skinnyを気軽に使えるように、DBIx::Class::Resultsetっぽいインターフェースをつけてみようと思い:

 my $rs = $skinny->resultset_dbictic( 'foo',
     { 'id' => 1 },
     {
         'select' => [ 'hoge', 'huga' ],
         'order_by' => 'id DESC',
     }
 ); # group_by, havingなども

ページングもつけようかな:

 my $rs = $skinny->resultset_dbictic( 'foo',
     undef,
     {
         'page' => 1, rows => 10,
         'order_by' => 'id DESC',
     }
 );
 my $itr = $rs->retireve;
 my $pager = $itr->pager;
 # 内部でcount用のステートを発行する。必要ならcount_subrefを渡す
 # (カウント用SQLと結果用カラムを返すサブルーチンリファレンス)。

いっそスキーマでリレーション定義してjoinできるように:

 package Your::Model::Schema;
 use DBIx::Skinny::Schema;
 use DBIx::Skinny::DBICTic::Schema;
 
 install_table 'user' => schema {
     pk 'id';
     columns qw(id name);
     has_many 'books'
       => 'user_book' => 'user.id = user_book.user_id';
 };
 
 install_table 'user_book' => schema {
    # ...
 };
 
 # package main;
 
 my $rs = $skinny->resultset_dbictic( 'user',
     { 'user.id' => 1 },
     {
         'join'    => [ 'books' ],
         '+select' => [ qw( books.name ) ],
         '+as'     => [ qw( book_name ) ],
     }
 ); # prefetch相当の機能は無し

  DBIx::Class使えよ、という本末転倒なわけですが、せっかくなのでhttp://github.com/makamaka/p5-dbix-skinny-dbicticに。

[]

■2010-01-05

* [近況] 年明けB!

  明けましておめでとうございます。今年もどうぞよろしくお願いいたします。



  さて、昨年末の冬コミの報告です。最初は通る人もそれほど多くなかったのですが、お昼頃からどんどん来ていただけました。プログラムをやったことがない方、普段Ruby、Pythonを使われる方々などがいらっしゃいました。あとHaskel使う人も(声をかけた限りでは普段Perl使ってるって人はいなかったの……でもxaicronさんがいっぱい買ってってくれました!)。
  それと、これからプログラムをやってみたいので勉強にと買っていってくれた方が何人か。若干、Acme大全で勉強になるのか気がかりではありますが…… というわけで、お越しくださった皆様、本当にありがとうございます。次回は「パーノレクインロマンス」か「Acmeカルタ」か何かで。

正誤表などはどんぞこ楽屋に掲載しますので、どうぞよろしくです。

そうえいば逆引き、背表紙の下黒く塗るの忘れてた(泣) それから入稿する際、フォントの設定間違えてコードサンプルなどの等幅フォント部分がひどいことになっています。ごめんなさい……

本日のツッコミ(全2件) [ツッコミを入れる]

_ 刺身☆ブーメラン [お疲れ様でした。 残念ながら冬コミは参加できませんでした。 次の夏コミか次の YAPC での「逆引き」再販をリク..]

_ まかまか [ありがとうございます! 「逆引き」はまだ在庫ありますし、無くなったら 再版しますので、どうぞよろしくお願いします..]

[]

■2009-12-27

* [近況] 『逆引き』届いたB!

 製本された『逆引き大全』が届きました。冬コミなのでそれほど持って行かなくてよいかな。
【31日 西よ-29b どんぞこ楽屋】


↑例によって厚みの参考。になってませんよ。

[]

■2009-12-07

* [近況] 『逆引きAcme大全 夢幻編』B!

 なんとか間に合った。Perlプログラマが必要とするありとあらゆる状況で、適切なAcmeモジュールを提示する『逆引きAcme大全 夢幻編』、冬コミに出します。84頁、500円(予)。「夢幻」(ゆめまぼろし)なのは、その内容のあまりの薄さに、無かったことにしたいから。
  まだ若干残っている『Pythons & PerlMongers』と、『Acme大全2009』も少々刷り増して持っていきます。

  12月31日(木)西よ-29b どんぞこ楽屋


表紙のリーバスしてる生物は「或ルバカ」。

[]