週末には少しPerlを。

Perlスクリプトの学習日記です。

CGI::Application::Plugin::DBHを使ってデータベースのテーブル内容を表示してみる

データベースに接続する

前回に引き続きCGI::Applicationの練習をいたします。 データベースにアクセスするための機能がPlug-inにありまして、これを使います。 cgiapp_init の中でDBに接続するコードを書きます。

use base 'CGI::Application';
use CGI::Application::Plugin::Session;
use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);

sub cgiapp_init {
    my $self = shift;

    my $dbname = "db";
    my $dsn = "DBI:Pg:dbname=$dbname";
    my $dbUser = "user";
    my $dbPass = "pass";

    $self->dbh_config($dsn, $dbUser, $dbPass);
}

HTML::Templateを使う

CGI::ApplicationはデフォルトでHTML::Templateを使えるようになっていまして、 これを使って表示させるとします。 setupの中でテンプレートファイルの所在を指定します。

sub setup {
    my $self = shift;
    $self->start_mode('listview_mode');

  # 略
    $self->tmpl_path('/some/path/to/template');
}

DBのテーブルを表示する

テーブルtblHogeの中身をlistview_modeというrun_modeで表示させるとします。

sub listview_mode {
    my $self = shift;
    my $template = $self->load_tmpl('listview.tmpl');

    my $sql = 'SELECT hoge_id, hoge_time, hoge_title from tblHoge LIMIT 5';
    my $sth = $self->dbh->prepare($sql);
    $sth->execute;

    my @rows;
    my ($hoge_id, $hoge_time, $hoge_title);
    $sth->bind_columns(\($hoge_id, $hoge_time, $hoge_title));

    while ($sth->fetch) {
        push @rows, {
            HOGE_ID => $hoge_id,
            HOGE_TIME => $hoge_time,
            HOGE_TITLE => $hoge_title,
        };
    }

    $template->param(LISTVIEW => \@rows);
    return $template->output;
}

テンプレートファイルlistview.tmplは以下のような感じ。

<html>
<head>
  <meta charset="utf-8">
  <title>Hoge</title>
</head>
<body>
  <table>
    <TMPL_LOOP NAME="LISTVIEW">
      <tr>
        <td><TMPL_VAR NAME="HOGE_ID"></td>
        <td><TMPL_VAR NAME="HOGE_TIME"></td>
        <td><TMPL_VAR NAME="HOGE_TITLE"></td>
      </tr>
    </TMPL_LOOP>
  </table>
</body>
</html>

昔は使えたかもしれない書き方

Web検索していると昔のブログ記事などで 「selectall_hashref(あるいはfetchrow_hashref)が返すリファレンスをそのままテンプレートに渡してOK!」 といったような記述に出会うことがありますが、少なくとも今はそんなことはできません。 DBIのメソッドの仕様が Ver.1.15 ~ 1.20の付近で変わった?とのこと。

参考:using CGI, DBI and HTML::Template