« ActivePerlでCatalystにチャレンジ!! | メイン | TiddlyWikiを外部公開するならHTMLのTITLEの中身を書き換えるべき。 »

続・ActivePerlでCatalystにチャレンジ!! (DB篇)

今回はデータベースも用いて、MVCフレームワークの実現の様子を辿っていきたいと思います。

実験ってことでRDBはSQLiteを使うことにしました。

基本的にPerl の MVC フレームワーク Catalyst に入門してみたを参考にしています。

そちらと併せながら読んでいただければと存じます。

SQLiteの準備

SQLiteをダウンロードします。

上記リンク内のPrecompiled Binaries For Windows内の最新版†1を取得し、解凍するとsqlite3.exeというファイルが展開されます。

パスの通った適当なフォルダ(例えばD:\usr\local\bin)に置きます。

まぁ最悪プロジェクトフォルダ内に置いてもいいんですが。

DBIの準備

次にSQLite関連のDBIを突っ込みます。

PPMコマンドでClass-DBI-Sqliteをインストールします。

細かいところは全部中略しますね。

D:\>ppm install Class-DBI-Sqlite
====================
Install 'DBIx-ContextualFetch' version 1.02 in ActivePerl 5.8.4.810.
====================
====================
Install 'Class-WhiteHole' version 0.04 in ActivePerl 5.8.4.810.
====================
====================
Install 'Ima-DBI' version 0.33 in ActivePerl 5.8.4.810.
====================
====================
Install 'DBD-SQLite' version 1.09 in ActivePerl 5.8.4.810.
====================
====================
Install 'IO-stringy' version 2.110 in ActivePerl 5.8.4.810.
====================
====================
Install 'Class-Trigger' version 0.09 in ActivePerl 5.8.4.810.
====================
====================
Install 'UNIVERSAL-moniker' version 0.08 in ActivePerl 5.8.4.810.
====================
====================
Install 'Class-DBI' version 0.96 in ActivePerl 5.8.4.810.
====================
====================
Install 'Class-DBI-Sqlite' version 0.09 in ActivePerl 5.8.4.810.
====================

プロジェクトの作成

Catalyst.batでPeturlを作り†2、Template::ToolkitなViewを作ります。

D:\Catalyst>catalyst.bat Peturl
created "Peturl"
created "Peturl\script"
created "Peturl\lib"
created "Peturl\root"
created "Peturl\t"
created "Peturl\t\m"
created "Peturl\t\v"
created "Peturl\t\c"
created "Peturl\lib\Peturl"
created "Peturl\lib\Peturl\M"
created "Peturl\lib\Peturl\V"
created "Peturl\lib\Peturl\C"
created "Peturl\lib\Peturl.pm"
created "Peturl/Build.PL"
created "Peturl/Makefile.PL"
created "Peturl/README"
created "Peturl/Changes"
created "Peturl\t/01app.t"
created "Peturl\t/02pod.t"
created "Peturl\t/03podcoverage.t"
created "Peturl\script/Peturl_cgi.pl"
created "Peturl\script/Peturl_fastcgi.pl"
created "Peturl\script/Peturl_server.pl"
created "Peturl\script/Peturl_test.pl"
created "Peturl\script/Peturl_create.pl"

D:\Catalyst>cd Peturl

D:\Catalyst\Peturl>perl .\script\Peturl_create.pl view TT TT
created "D:\Catalyst\Peturl\lib\Peturl\V\TT.pm"
created "D:\Catalyst\Peturl\t\v\tt.t"

DBの作成

SQLite(SQLite3.exe)でDBの物理ファイルを作ります。

次のSQL文を用意して実行するとD:\Catalyst\Peturl\tinyurl.dbというファイルが出来ます。

D:\Catalyst\Peturl>type setup.sql
CREATE TABLE tinyurl (
    id TEXT PRIMARY KEY,
    longurl TEXT
);

D:\Catalyst\Peturl>sqlite3 .\tinyurl.db < setup.sql

Modelの作成

MVCでいうところのM(=model)の作成。

案の定エラーが出ました。

D:\Catalyst\Peturl>perl .\script\Peturl_create.pl model CDBI CDBI dbi:SQLite:D:\
Catalyst\Peturl\tinyurl.db
Couldn't load helper "Catalyst::Helper::Model::CDBI", "Can't locate Catalyst/Hel
per/Model/CDBI.pm in @INC (@INC contains: D:/usr/local/perl/lib D:/usr/local/per
l/site/lib .) at (eval 34) line 3.
" at D:/usr/local/perl/site/lib/Catalyst/Helper.pm line 148.

CPANからCatalyst-Model-CDBIを取得。

再びコマンド実行すると、今度はClass::DBI::Loaderが足りない模様。

これはppmで提供されているのでこちらから取得しました。

D:\Catalyst\Peturl>ppm install Class-DBI-Loader

そして、リトライ。

D:\Catalyst\Peturl>perl .\script\Peturl_create.pl model CDBI CDBI dbi:SQLite:D://
Catalyst/Peturl/tinyurl.db
created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI.pm"
created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI"
created "D:\Catalyst\Peturl\lib\Peturl\M\CDBI\Tinyurl.pm"
created "D:\Catalyst\Peturl\t\m\cdbi_tinyurl.t"

Peturl.pmの修正

ベースはPerl on Rails な Catalyst を試すのソースなのですが、Peturl.pmについては以下のような感じに書換えています。

sub default : Private {
  my ( $self, $c ) = @_;
  my $key = $c->req->path;
  $key =~ s/^\///;
  if ($key and $key ne 'create') {
    my $t = Peturl::M::CDBI::Tinyurl->retrieve($key) or die $!;
    $c->res->redirect($t->longurl);
  }
  $c->stash->{template} = 'index.tt';
  $c->forward('Peturl::V::TT');
}

sub create : Global  {
  my ( $self, $c ) = @_;
  my $longurl = $c->req->params->{longurl};
  $longurl = 'http://' . $longurl unless $longurl =~ /^http(?s):\/\//i;
  my $tinyurl = Peturl::M::CDBI::Tinyurl->search_or_generate($longurl);
  $c->stash->{tinyurl} = $tinyurl;
  $c->stash->{template} = 'index.tt';
  $c->forward('Peturl::V::TT');
}

テスト

ではHTTPdを起動して、http://localhost:3000/にアクセスしてみましょう。

D:\Catalyst\peturl>perl .\script\peturl_server.pl

動きました†3

今回はプロジェクト作成時にPeturlとpeturlのtypoをしてしまい、 $c->forward('Peturl::V::TT');の処理で「Peturl::V::TTが見つからんよ」と随分怒られました。

当たり前っちゃ当たり前なのですが、もしこういうことがあればpackege名を見つめなおす必要があるかもしれませんね。

とりあえず簡単なアプリが構築できるのが分かったので、何かもう少しボリュームのある作例でCatalystと付き合ってみたいと思います。

  • †1: このドキュメント記述時でsqlite-3_2_2.zip
  • †2: といいつつコマンドでperturlとしてしまいpackage名の大小区別に悩まされました。コピペするならコピペで挑みましょう…
  • †3: ちなみに終了はCtrl+Cで終わってるんですが、これでいいんですかね?

トラックバック

このエントリーのトラックバックURL:
http://hsj.jp/blog/mt-tb.cgi/1237

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2005年07月20日 09:28に投稿されたエントリーのページです。

ひとつ前の投稿は「ActivePerlでCatalystにチャレンジ!!」です。

次の投稿は「TiddlyWikiを外部公開するならHTMLのTITLEの中身を書き換えるべき。」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type