トップ «前の日記(■2010-03-03) 最新 次の日記(■2010-03-18)» 編集

どんぞこ日誌

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|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|
2023|03|
2024|02|07|10|

同人関連(どんぞこ楽屋) | 旧い雑文   


■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 (■2010-03-08 18:30)

multi pk supportをSkinny本体にとりこんでみました。 <br>http://github.com/nekokak/p5-dbix-skinny/commit/a6dfc173a23c7ab9a4d2e7eee82453a0c43a9d96 <br>です

_ まかまか (■2010-03-08 23:12)

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

本日のTrackBacks(全1件) []
_ どんぞこ日誌:DBIx::Skinny関連モジュール (■2010-03-18 15:38)

先日書いたDBIx::Skinny関連のモジュールは3つとも本体に取り込んでいただけました。これらの機能はもうDBIx::Skinny(0.0705以降)だけで実現できます。