catalyst メモ
テンプレートの作成方法〜サーバー実行まで
% catalyst.pl Bookmark
% cd Bookmark
% export DBIC_TRACE=1 #SQLを目視できる
% ./script/bookmark_server.pl
% ./script/bookmark_server.pl -r
※-rを付けるとファイルの変更で読み直す
http://localhost:3000/
テーブルの設計
create table bookmark (
bookmark_id integer auto_increment primary key,
url varchar(255) ,
title varchar(255) ,
record_time timestamp ,
comment text
);
ライブラリの構造
Bookmark lib Bookmark Model View Controller Root.pm --------ルートクラス root static --------静的ファイル script bookmark_server.pl bookmark_create.pl bookmark_test.pl t --------テストスクリプト bookmark.yml --------設定ファイル
必要なモジュール類のインストール
「出力」
cpan install Catalyst::View::TT テンプレートツールキット
cpan install Catalyst::View::JSON
cpan install Catalyst::View::Email
cpan install Catalyst::View::Download::CSV
「データ」
cpan install Catalyst::Model::DBIC::Schema //DBIx::Class::Schemaによるデータベースアクセス
アトリビュートのルール
※1Localアトリビュート
ファイルパス /bar/foo
クラス Bar
メソッド foo
※2Privateアトリビュート
sub hogehoge:Private
とすると外部から読まれなくなる。
変わりにdefaultクラスが呼ばれる。
※3Globalアトリビュート
package Bookmark::Controller::Bar::Buz;
sub hogehoge :Global{}
とするとファイルパスは/hogehogeで読まれる
メソッドの書き方
request
$c->req->param('key');
response
$c->res->status(404);
$c->res->body('body');
log
$c->log->info('info message');
$c->log->debug('debug message');
stash
テンプレートなどへの値の受け渡しなど。
ハッシュリファレンスを返す
$c->stash('aaaaaa');
forward
$c->forward('/action');
$c->forward('Bookmark::View::TT', 'process');
$c->forward('Bookmark::View::TT');
===================================================================
(参考)http://d.hatena.ne.jp/perlcodesample/20100210/1264257759
※ハッシュリファレンスとは。。
スカラ、配列、ハッシュの他に、perl独自にリファレンスという変数がある。
$ スカラー変数
@配列変数
%連想配列(ハッシュ変数)
「リファレンス」は値を記録する代わりに、値を格納しているアドレスを記録する
$wrod = "A";
$ref_word = \$word; //wordへのリファレンス
$ref_array = \@list;//配列のリファレンス
$ref_hash = \%hash;//ハッシュのリファレンス
$ref_sub = \⊂//関数のリファレンス
print $$ref_word;
print @ref_array;
print \%hash;
そんで、
引っ掛けのようなプログラムがこちら。
my $array = [1,2,3] #配列なのにスカラ変数に代入?
my @array = (1,2,3) #本来はこうあるべき
↑はこういう意味。
my @array = (1, 2, 3);
my $array = \@array;
とのこと。
===================================================================
モデルの作成
use Catalyst qw/-Debug ConfigLoader Static::Simple
FillInForm Charsets::Japanese Prototype/;
lib/Bookmark/Mode/Schema.pmに記載
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
package Bookmark::Schema;
use strict;
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->loader_options
(
relationships => 1,
# debug => 1,
);
1;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
(参考)http://logic.moo.jp/memo.php/archive/491
#モジュールのインストール
cpan install Catalyst::Helper::Model::DBIC::Schema
#DBD-mysqlのインストール
yum install perl-DBD-MySQL
cpan install DBD::mysql
yum install mysql-devel
#スキーマクラスの作成
./script/bookmark_create.pl model DBIC DBIC::Schema Bookmark::Schema
(結果)
exists "/var/catalysttest/Bookmark/script/../lib/Bookmark/Model"
exists "/var/catalysttest/Bookmark/script/../t"
created "/var/catalysttest/Bookmark/script/../lib/Bookmark/Model/DBIC.pm"
created "/var/catalysttest/Bookmark/script/../t/model_DBIC.t"
#結果
/lib/Bookmark/Model/DBIC.pm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
use strict;
use base 'Catalyst::Model::DBIC::Schema';
__PACKAGE__->config(
schema_class => 'Bookmark::Schema',
);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
スキーマクラスの作成
$
./script/bookmark_create.pl model MyDB DBIC::Schema \
Bookmark::Schema create=static \
dbi:mysql:test:xxx.xxx.xxx.xxx:3306 IDDD PASSSS
SQLの書き方
※SELECT文
select distinct カラム名 from table1 where カラム名 = 条件
DBICで書くと・・
my $rs = $c->model('DBIC::table1')->search(
{カラム名=>'条件値',},
{select => [{distinct => ['カラム名']}],
as => ['カラム名2'],
]
);
my $rs = $c->model('DBIC::table1')->search(
{カラム名 => '条件式',},
{countt=>[{distinct=>['カラム名']}],
as => ['カラム名2'],
}
);
※.pmがないときの対処法
failed: Can't locate DBD/mysql.pmとでる。。
DBI Connection failed: install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /var/catalysttest/Bookmark/script/../lib /usr/local/lib/perl5/5.10.1/x86_64-linux /usr/local/lib/perl5/5.10.1 /usr/local/lib/perl5/site_perl/5.10.1/x86_64-linux /usr/local/lib/perl5/site_perl/5.10.1 .) at (eval 377) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
(参考)
http://ash.roova.jp/cipher/2010/07/locallib---perl.html
#mysql.pmを探す
find / -name mysql.pm
(結果)
/usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm
use lib '/usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm';
読込み先のデータはどのようにして、読み込むか!?
2.特殊変数「@INC」とは?下記のワンライナーを実行してみる。
#perl -e 'print $i++ . ":" . "$_\n" foreach @INC'
(結果)
0:/usr/local/lib/perl5/5.10.1/x86_64-linux
1:/usr/local/lib/perl5/5.10.1
2:/usr/local/lib/perl5/site_perl/5.10.1/x86_64-linux
3:/usr/local/lib/perl5/site_perl/5.10.1
4:.
解決策
@INCを拡張
1.libプラグマ
use FindBin;
use lib "$FindBin::Bin/../lib";
2.BEGIN { unshift(@INC, LIST) }
3.local::libを使う
4.パスの場所の.pmをコピーする
cp -i /usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/mysql.pm /usr/local/lib/perl5/5.10.1/x86_64-linux/mysql.pm
cp -r /usr/local/lib/perl5/site_perl/5.10.1/DBIx/Skinny/DBD/ /usr/local/lib/perl5/5.10.1/x86_64-linux/DBD/
cpan install DBD::mysql
capn install Catalyst::Model::DBI
capn install Catalyst::Model::DBIC::Schema