最近CPANモジュールのPodを読みまくっている.でも英語はさっぱりわからない.で,【エキサイト】【翻訳】の出番です.意外と理解できるなぁ.もちろんそのまま使えるわけでもないけど,昔と比べて翻訳の質も上がってるような気がする.Perlのドキュメントを読むときは::を-に変えると読みやすくなるし,誤訳も減る気がする
単語も文法もぜんぜん知らないけどなんとかなるもんだ.でも,もう少し勉強しないと.中学生になったぐらいで止まってるからなぁ
最近CPANモジュールのPodを読みまくっている.でも英語はさっぱりわからない.で,【エキサイト】【翻訳】の出番です.意外と理解できるなぁ.もちろんそのまま使えるわけでもないけど,昔と比べて翻訳の質も上がってるような気がする.Perlのドキュメントを読むときは::を-に変えると読みやすくなるし,誤訳も減る気がする
単語も文法もぜんぜん知らないけどなんとかなるもんだ.でも,もう少し勉強しないと.中学生になったぐらいで止まってるからなぁ
DBIC_TRACE=1は作ってるときは必須だ.ファイルに書き出したいときはDBIC_TRACE=1を指定した上でこうするとできるそうな(Manualのはカッコ抜けてる)
$schema->storage->debugfh(IO::File->new('/tmp/trace.out', 'w'));
追記していきたいなら'w'を'a'に変えればよい(もちろん'>'や'>>'でもok)
上書きでいいならDBIC_TRACEにこう書いてもよし
export DBIC_TRACE="1=/tmp/trace.out"
[参照]
http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Troubleshooting.pod#Tracing_SQL
prefetch → 「前-フェッチ」
Pre-fetching → プレ魅惑的です。
適宜追加予定
まとめてあるのは結構少ないー.WEB+DB PRESS Vol.36のnaoyaさんの記事期待
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Manual/Intro.podの抜き出しメモ(間違っても翻訳ではない).で,Schemaへの接続から
#これでいいんじゃないかな? my $another_schema = My::Schema->connect( $dsn, $user, $password, $attrs, { on_connect_do => \@on_connect_sql_statments } );
詳しくはこちら→http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Storage/DBI.pm
## R #いちばん簡単プライマリキィで呼び出し my $album = $schema->resultset('Album')->find(14); ## U #取得したデータに値を設定してupdateできるよ $album->title('Physical Graffiti'); my $title = $album->title; # $title holds 'Physical Graffiti' #自動設定されてるアクセサを使ってもできるね $album->set_column('title', 'Presence'); $title = $album->get_column('title'); #んで,コミット $album->update; #ロールバックかな #is_changedで変更されているかわかるよ $album->discard_changes if $album->is_changed; ## C ##追加する my $new_album = $schema->resultset('Album')->create({ title => 'Wish You Were Here', artist => 'Pink Floyd' }); #すぐにアップデートできるよ $new_album->label('Capitol'); $new_album->year('1975'); $new_album->update; ## D #もちろん削除も $new_album->delete; #直接ResultSetから削除も # Delete all of Falco's albums $schema->resultset('Album')->search({ artist => 'Falco' })->delete;
いや,ある意味戦いか…
#artistで検索 # Find all of Santana's albums my $rs = $schema->resultset('Album')->search({ artist => 'Santana' }); #最初のください my $album = $rs->first; print $album->title; #ループでアップデート while (my $album = $rs->next) { print $album->artist . ' - ' . $album->title; $album->year(2001); $album->update; } #まとめてアップデートもできるよ $rs->update({ year => 2001 }); #リストコンテキストだと該当行を全部返します # Fetch immediately all of Carlos Santana's albums my @albums = $schema->resultset('Album')->search( { artist => 'Carlos Santana' } ); foreach my $album (@albums) { print $album->artist . ' - ' . $album->title; } # LIKEで探す # Find albums whose artist starts with 'Jimi' my $rs = $schema->resultset('Album')->search_like({ artist => 'Jimi%' }); # WHERE節を自分で作ったり # Find Peter Frampton albums from the year 1986 my $where = 'artist = ? AND year = ?'; my @bind = ( 'Peter Frampton', 1986 ); my $rs = $schema->resultset('Album')->search_literal( $where, @bind ); #もっと複雑なのがいいならSQL::Abstractを.なんでもできる(はず) my $rs = $schema->resultset('Album')->search({ artist => { '!=', 'Janis Joplin' }, year => { '<' => 1980 }, albumid => [ 1, 14, 15, 65, 43 ] }); #上のはこういうSQL書くのと同じこと #WHERE artist != 'Janis Joplin' # AND year < 1980 # AND albumid IN (1, 14, 15, 65, 43) #ハッシュでattributesを指定して検索の条件を指定したり my @albums = My::Schema->resultset('Album')->search( { artist => 'Bob Marley' }, { rows => 2, order_by => 'year DESC' } );
もっとサンプル→
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Manual/Cookbook.pod
これを見よう→
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSet.pm
http://search.cpan.org/~nwiger/SQL-Abstract-1.22/lib/SQL/Abstract.pm
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Manual/Intro.podの抜き出しメモ.まずスキーマの作成まで
データベースからの情報が絶対に必要になるまでqueryされない.ResultSetするだけではqueryしないよ
自動でDB用classを設定するにはDBIx::Class::Schema::Loaderを使う
#まず宣言・継承 package My::Schema; use base qw/DBIx::Class::Schema/; #実際にどのSchemaを読み込むか設定.ここではAlbum,Artist # load My::Schema::Album and My::Schema::Artist __PACKAGE__->load_classes(qw/ Album Artist /); #複数の名前空間で呼び出したい場合はこのように書く # load My::Schema::Album, My::Schema::Artist and My::OtherSchema::LinerNotes __PACKAGE__->load_classes( { 'My::Schema' => [qw/ Album Artist /], 'My::OtherSchema' => [qw/ LinerNotes /] } ); #自動でクラスをすべて読み込むなら何も指定しない # load My::Schema::* __PACKAGE__->load_classes(); 1;
#宣言・継承 package My::Schema::Album; use base qw/DBIx::Class/; #ロードするコンポーネントの指定 #PK::Autoはオートインクリメント __PACKAGE__->load_components(qw/ PK::Auto Core /); #テーブル名を指定 __PACKAGE__->table('album'); #カラム名を指定 __PACKAGE__->add_columns(qw/ albumid artist title /); #カラム名の指定の際に詳細を指定することもできる #DBICではあまり直接は使ってないけど, #DBIx::Class::WebForm とかでは使ってる(らしい) #設定の方法はDBIx::Class::ResultSourceを見てね #http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSource.pm __PACKAGE__->add_columns( albumid => { accessor => 'album', data_type => 'integer', size => 16, is_nullable => 0, is_auto_increment => 1, default_value => '', }, artist => { data_type => 'integer', size => 16, is_nullable => 0, is_auto_increment => 0, default_value => '', }, title => { data_type => 'varchar', size => 256, is_nullable => 0, is_auto_increment => 0, default_value => '', } ); #プライマリキィの設定 __PACKAGE__->set_primary_key('albumid'); #複数プライマリキィがあったらリストで __PACKAGE__->set_primary_key( qw/ albumid artistid / ); # リレーションの設定もしてね # http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Relationship.pm __PACKAGE__->has_many('albums', 'My::Schema::Artist', 'album_id'); 1;
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/ResultSource.pm
http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Relationship.pm
簡単〜
package My::Schema; use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options( relationships => 1 ); 1;
もっと詳しく!→http://search.cpan.org/~blblack/DBIx-Class-Schema-Loader-0.03009/lib/DBIx/Class/Schema/Loader.pm