tokuhirom's Blog

Amon2::DBI からはじめるデータベースアプリケーション 〜 軽量フレームワークAmon2入門 (5) 〜

はい! というわけで3連休あけですね。 Ruby 会議にいったり、Android なんとかにいったり、リア充生活をおくったりと、各自たのしい3連休をすごされたことかとおもいます。

さて、連休あけの今日は、かるく Amon2::DBI について解説をしてきましょう。

Amon2::DBI は、DBI の薄いラッパーで「素の DBI だとちょっと不便だな」というところにピリリときいてくる山椒のような存在です(ちかくのチンマーハンは山椒がきいてなさすぎるので、もうちょいきいてるといいなとおもいます)。非常にうすいラッパーだし、コードベース自体も非常に簡潔なので、ひととおりよんでからつかうといいかとおもいます。

DBI には子クラスを設定できる機能があって、Amon2ではそれをつかって拡張しています。詳細については DBI の Subclassing the DBI の項目をよんでください。

Amon2::DBI は一般的な O/R Mapper ではなく、非常にうすいラッパーです。O/R Mapper をつかいたい場合には、id:nekokak が中心となって lestrrat さんや僕が協力してつくった O/R Mapper であるところの Teng を利用するとよいです。Amon2 で Teng をつかう方法などについては後でのべるかとおもいます。

Amon2::DBI 自体は Amon2 のコア機能ではありませんが、O/R Mapper をつかわない場合で DB へのアクセスをともなう場合にはこれをつかうのがオススメです。

Amon2::DBI のつかいかた

Amon2::DBI は DBI の子クラスですから、通常の DBI と同様に接続すればつかえます。

my $dbh = Amon2::DBI->connect('dbi:SQLite:', '', '');

Amon2::DBI の機能

この Amon2::DBI で提供されている機能は以下のとおりです。

  • AutoInactiveDestroy を有効にする
  • UTF-8 フラッグに関連するオプションを適切に設定する
  • ネストしたトランザクションの管理
  • RaiseError などの設定
  • 簡単な SQL の生成機能

それでは、各機能の詳細についてみていきましょう。

AutoInactiveDestroy の自動設定

fork(2) をした場合に問題がおきないように AutoInactiveDestroy フラッグが設定されます。
(DBI のバージョンが 1.614 より古い場合にはこの機能が実装されていないため設定されません)

UTF-8 フラッグ関連のオプションを適切に設定します。

通常 DBI からとりだしたデータは UTF-8 フラッグがたたないわけですが、これは不便なので DBD::SQLite を利用している場合には sqlite_unicode フラッグを、DBD::mysql を利用している場合には mysql_enable_utf8 を自動的に有効にします。

RaiseError を有効に

デフォルトで RaiseError を有効にしておいた方が無難でしょう。LL プログラマさんはたいがいエラー処理をおこたりがちですから。

SQL の生成用のヘルパーメソッド

$dbh->do_i(@args)
SQL::Interp をつかって SQL を生成して実行します。たとえば以下のようになります。

$dbh->do_i(q{INSERT INTO foo }, {bar => 3});
# => INSERT INTO foo (bar) VALUES (3);

$dbh->insert($table, \%row);

INSERT文を発行します。

まとめ

今回は Amon2::DBI について解説しました。Amon2::DBI 自体はつかわなくて Teng でも普通に Amon2 と接続できるのですがそのあたりの話はまた今度。