Catalyst + Lighttpd + FastCGI + DBIC + Schema::Loader に関する備忘録
ここ数ヶ月 Catalyst を触っていなかったらメキメキと記憶から知識が抜けてました・・・orz
恐ろしいことに DBIC もメキメキと忘れてました・・・orz
僕はどちらかというと OR Mapper を使うよりも SQL 直書きしたほうが理解が早い部類の人間なので DBIC つかって distinct とかするコードを書くのが面倒くさくて仕方がない。なので本業の Sledge ベースのアプリは Model 部分に自前の DBI ラッパー使ってコネクションとかも管理してます。
※ココ時代と逆行してるんでしょうね・・・
とはいえ忘れたままは悔しいので、最近ちょっとしたアプリを作るために Catalyst を使って書いていろいろメモったのを備忘録として残して自分用に公開。ってか DBIC のことなら DBIx::Class::Schema::Loader がデータベースの構造から自動生成した Schema クラス http://svn.unknownplace.org/public/library/perl/trunk/Catalyst-Helper-Lighttpd/
DBIC で書くとこんなのになる。
DBIC で書くとこんなのになる。
なんだか、急激に書くのが面倒になってきました。。後は未来の自分もココ見て下さい。
http://search.cpan.org/~mstrout/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod
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
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 上で動かしたのですがかなり高速に動作していいかんじ。
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 で書くとこんなのが、
my $rs = $c->model('DBIC::table1')->search(
{ カラム名 => '条件値', },
{ select => [ { distinct => [ 'カラム名' ] } ],
as => [ 'distinct 後のカラム名' ],
}
);
SELECT COUNT(DISTINCT colname)
SQL で書くとこんなのが、
my $rs = $c->model('DBIC::table1')->search(
{ カラム名 => '条件値', },
{ countt => [ { distinct => [ 'カラム名' ] } ],
as => [ 'count名' ],
}
);
コメントやシェアをお願いします!