Class::DBIあれこれ

とてつもなく便利なモジュールだが、デフォルトで使うとちょっと困った点が。
データベースハンドルの扱いのことだ。しかしテキストを見るとできないこともないようだ。
方策としては、

  1. Class::DBIが握りこんでいるハンドルをどっかから取って来る。
  2. あらかじめ作ったデータベースハンドルをClass::DBIにも使わせる。

のどちらかだ。
1は、もしかしたら、Class::DBI->db_Mainで取り出せるのかも。
2は、set_dbを行わずに、データベースハンドルを返すdb_Mainメソッドを作ればいいのかも。
ちょっと実験してみよう。
さらに注意点。本来アリウベカラザル状況だが、テーブルのカラム名SQL予約語を使うと、さしものClass::DBIもずっこける。つうか、そもそも予約語カラム名にするなと。orz
ちなみにどの単語が予約語になるかは、RDBM毎に違うので注意が必要ってか、最初から使わなければいいので気にする必要がない。orz
実験してみた。
イメージとしては、こんな感じのスクリプト

use DBI
my $dbh = DBI->connect(...);
use Class::DBI;
Class::DBI->set_db('Main', ...);
my $c = Class::DBI->db_Main;
use Data::Dumper;
print Data::Dumper->new([$dbh, $o], ['dbh', 'o'])->Dump();

すると結果は。

$dbh = bless( {}, 'DBI::db' );
$o = bless( {}, 'DBIx::ContextualFetch::db' );

……は? 「DBIx::ContextualFetch::db」って、何?
CPANでさがす。すると。
DBIx::ContextualFetch - Add contextual fetches to DBI - metacpan.org
こういうものだとわかった。
んで、ソース自体も確認してみると、DBI関係のサブクラスで、主にexecuteやfetchを上書きするものようだ。execute一つでbind_paramとbind_colの二つが実行でき、fetchはスカラーコンテキストでは配列へのリファレンスを返し、配列コンテキストでは配列を返す。そんな感じである。
本来の動作はさまたげないようになっているようなので、2の方策は使わない方がいいだろう。
そしてググる過程でPerlの汚染モードに苦戦 - libnitsuji.soなんてものも見つけて勉強になりますはい。