Class::DBI

最終更新日時:2011-08-31 17:06:34
Perl

Class::DBIとは


Class::DBI は Perl で DB 操作を行うためのモジュールです。
DB 操作を行うスタンダードなモジュールとして DBI がありますが、DBI と比較するととてもシンプルで使いやすいです。
特に Template-Toolkit と組み合わせて使うと非常に便利で、PerlによるWebアプリケーションの実装の代表的なパターンの1つといってよいかと思います。
また、Class::DBIは内部ではDBIを使用しているので、最悪の場合DBIレベルの操作をすることもできます。
従って、当然機能的にもDBIに劣ることはありません。

デバッグ


環境変数 DBI_TRACE を 2 に設定すると、Class::DBI が発行している SQL を確認することができます。

キャッシュ問題


Class::DBI-0.96以降では、オブジェクトの生成にはキャッシュが利くようになっているらしいです。
なんて改悪(-_-#
キャッシュするかどうかを選択できるようにしてくれればいいし、せめてキャッシュしない方に倒して欲しいですな。
このキャッシュを回避するには、以下のように記述するとキャッシュが無効になるようです。

 $Class::DBI::Weaken_Is_Available = 0;



今ハマっている問題(/_\;)


原因不明なのだが、

・DBにPostgreSQLを使用
・Class::DBI::Pgを継承
・Class::DBIのhas_manyでリレーションを設定

上記のような条件の時に、add_to_???でInsertしようとすると以下のようなエラーが発生することがある。

 Can't insert new XXX Can't get last insert id at /path/to/perl/lib/Class/DBI/Relationship/HasMany.pm line 112


しかも、エラーが出ているわりにはデータがInsertされていることもあり、挙動も少々ハッキリしていない。

ちなみに、以下の対応で回避できたことがあるが、毎回有効とは限らない模様。

・sequenceメソッドで明示的にsequenceを設定する(おそらくこれは毎回有効だった記憶が)
・問題となっているテーブルを再作成する(PostgreSQLの異なるバージョン間で移行したりしない限りは多分意味無し)

※2009/09/25追記
ついこの前、某サイトの作業で上記の現象が発生。
この時は、DBD::Pgが古かったようで、これをupdadeしたら解決しました。
もしかしたら、それまでの同様の現象もDBD::PgをupdateでOKかも。

リンク


タイトル概要
Class::DBI - シンプルなデータベース抽象クラスClass::DBI-0.94 のドキュメントの日本語訳
お問い合わせは 掲示板 にて。