2006年04月21日

DBIでデータベースの内容をハッシュ配列で取得する

今時のPerl使いの方は、データベースアクセスにはClass::DBIを使っているのでしょうか?

ボクは仕事柄Class::DBIを使えないサーバーで動かすCGIを作ることが多いので、今でもDBIを使っています。Class::DBIも勉強しなきゃなぁ…。

それはともかく、SELECT文の結果をハッシュ配列で取得する方法を書いてみます。

バージョン1.20より古いDBIでは、$dbhをデータベースハンドルオブジェクトとした場合
my $sql = 'SELECT id, name FROM test WHERE age < ?';
my $rows = $dbh->selectall_hashref( $sql, undef, 20 );
のようなプログラムで
$rows = [
{ id => 1, name => 'aaaa' },
{ id => 2, name => 'bbbb' },
];
のような値が取得できました。

バージョン1.20でこの仕様が変更になっています。

同じような値を取得するには、selectall_hashref()メソッドではなく、selectall_arrayref()メソッドを使います。
my $sql = 'SELECT id, name FROM test WHERE age < ?';
my $rows = $dbh->selectall_arrayref( $sql, { Columns => {} }, 20 );
第二引数として、{ Columns => {} } を渡すのがポイントです。

これは、ステートメントハンドルメソッドのfetchall_arrayref()を使う場合に空のハッシュを渡すことに相当します。
my $rows = $sth->fetchall_arrayref( {} );
DBIには、引数として\%attrを渡すメソッドが多いけど、具体的にどのような値を渡せばいいかイマイチわかりにくいんですよね。←ボクだけ?

Googleで日本語サイトを対象に検索してみてもこのselectall_arrayref()に{ Columns => {} }を渡すやり方を書いているのは、ボクがKansai.pmのイベントで発表した資料だけでした。当たり前すぎるのか、案外知られていないのか、需要が無いのか、さて、どれでしょう(^^;?

なお、バージョン1.20は2001年8月24日リリースです。さすがに今時のサーバーではそれ以前の古いバージョンをインストールしていることは無いと思うので、古い方法を覚えておく必要はないでしょう。

そのうち、Wikiの方にもうちょっとまとめて書きます。いつになるかは…ゴニョゴニョ。
posted by はしもと at 12:20| Comment(0) | TrackBack(0) | Perl
この記事へのコメント

この記事へのトラックバック