Catalyst + Lighttpd + FastCGI + DBIC + Schema::Loader に関する備忘録

ここ数ヶ月 Catalyst を触っていなかったらメキメキと記憶から知識が抜けてました・・・orz
恐ろしいことに DBIC もメキメキと忘れてました・・・orz

僕はどちらかというと OR Mapper を使うよりも SQL 直書きしたほうが理解が早い部類の人間なので DBIC つかって distinct とかするコードを書くのが面倒くさくて仕方がない。なので本業の Sledge ベースのアプリは Model 部分に自前の DBI ラッパー使ってコネクションとかも管理してます。
※ココ時代と逆行してるんでしょうね・・・

とはいえ忘れたままは悔しいので、最近ちょっとしたアプリを作るために Catalyst を使って書いていろいろメモったのを備忘録として残して自分用に公開。ってか DBIC のことなら DBIx::Class::Manual::Cookbook - Miscellaneous recipes みればいいよって。

- スポンサーリンク -

Catalyst Helper > DBIx::Class::Schema::Loader で Schema クラス自動生成

何故か不思議なことに自分が書いた記事を参考にして作っている自分がいます。 Perl の MVC フレームワーク Catalyst のお勉強〜その1〜 :: Drk7jp この記事を書いた頃と違って、Catalyst の Model / Schema 定義も随分楽にできるような世の中になっているみたいです。今時?の Catalyst helper でアプリを作る手順はこんな感じ?事前にデータベース作成とテーブル作成はすませておきます。後はアプリ名を決めて(以下実行ログでは MyApp とする)ヘルパー実行するだけ。赤字の部分は補完して読んで下さい。

catalyst.pl  MyApp
cd MyApp
perl  -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib  -e  'make_schema_at  "MyApp::Schema",  {relationships => 1, debug => 1},  ["dbi:mysql:myapp","user","pass"]'
cd script/
perl  myapp_create.pl model  DBIC  DBIC::Schema  MyApp::Schema  dbi:mysql:myapp user pass
perl  myapp_create.pl  view  TT  TT

DBIx::Class::Schema::Loader がデータベースの構造から自動生成した Schema クラス
 lib/MyApp/Schema.pm
 lib/MyApp/Schema/table1.pm
 lib/MyApp/Schema/table2.pm
 ・・・・
がもりもりと生成され、実行時に Schema::Loader が動的に解析することも無くなって起動とかも高速になります。※特に Oracle の場合は Schema::Loader が動的にクラスを自動生成する部分が遅いので起動部分の体感とか結構あがる。できあがった server スクリプトを起動してみるとちゃんと DBIC 動いてるのがわかります。こりゃ楽ちん。

perl myapp_server.pl -p 3000 -r[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader  0.13                                       |
| Catalyst::Plugin::Static::Simple  0.15                                     |
'----------------------------------------------------------------------------'

[debug] Loaded dispatcher "Catalyst::Dispatcher" [debug] Loaded engine "Catalyst::Engine::HTTP" [debug] Found home "/home/test/Catalyst/MyApp" [debug] Loaded Config "/home/test/Catalyst/MyApp/myapp.yml" [debug] Loaded components: .-----------------------------------------------------------------+----------. | Class | Type | +-----------------------------------------------------------------+----------+ | MyApp::Controller::Root | instance | | MyApp::Model::DBIC | instance | | MyApp::Model::DBIC::testtable | class | | MyApp::View::TT | instance | '-----------------------------------------------------------------+----------'
[debug] Loaded Private actions: .----------------------+--------------------------------------+--------------. | Private | Class | Method | +----------------------+--------------------------------------+--------------+ | /default | MyApp::Controller::Root | default | | /end | MyApp::Controller::Root | end | '----------------------+--------------------------------------+--------------'
[info] MyApp powered by Catalyst 5.7007 You can connect to your server at http://localhost:3200

Lighttpd + Catalyst + FastCGI

lighty で Catalyst を FastCGI として動作させるのはいろいろとテクがいるみたい。Lighttpd-Catalyst Technique さえ読んでおけばOK!動作させる方法は2つ,3つあるみたいだけど、こんな感じのを採用してみた。Catalyst-Helper-Lighttpd 使うともっと楽らしい。はじめて Catalyst を Lighttpd 上で動かしたのですがかなり高速に動作していいかんじ。

http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Lighttpd/

server.document-root = "/home/test/Catalyst/myapp/root"
alias.url += ( "/script/" => "../myapp/script/", )
setenv.add-environment = (
    "SCRIPT_NAME" => "/",
)
url.rewrite-once = (
   "^/(?!favicon\.ico$|js/|css/|images?/|static/)(.*)" => "/script/myapp_fastcgi.pl/$1",
)
fastcgi.server = (
    "/script/myapp_fastcgi.pl" => ((
        "socket" => "/tmp/myapp_fastcgi.socket",
    ))
)

SELECT DISTINCT with multiple columns

SQL で書くとこんなのが、

select distinct カラム名 as カラム名改 from table1 where カラム名=条件値

DBIC で書くとこんなのになる。

  my $rs = $c->model('DBIC::table1')->search(
    {  カラム名 => '条件値', },
    {  select   => [ { distinct => [ 'カラム名' ] } ],
       as       => [ 'distinct 後のカラム名' ],
    }
  );

SELECT COUNT(DISTINCT colname)

SQL で書くとこんなのが、

select count(distinct カラム名) as count from table1 where カラム名=条件値

DBIC で書くとこんなのになる。

  my $rs = $c->model('DBIC::table1')->search(
    {  カラム名 => '条件値', },
    {  countt   => [ { distinct => [ 'カラム名' ] } ],
       as       => [ 'count名' ],
    }
  );

なんだか、急激に書くのが面倒になってきました。。後は未来の自分もココ見て下さい。

http://search.cpan.org/~mstrout/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod

- スポンサーリンク -