英語のドキュメント

最近CPANモジュールのPodを読みまくっている.でも英語はさっぱりわからない.で,【エキサイト】【翻訳】の出番です.意外と理解できるなぁ.もちろんそのまま使えるわけでもないけど,昔と比べて翻訳の質も上がってるような気がする.Perlのドキュメントを読むときは::を-に変えると読みやすくなるし,誤訳も減る気がする

単語も文法もぜんぜん知らないけどなんとかなるもんだ.でも,もう少し勉強しないと.中学生になったぐらいで止まってるからなぁ

DBIC_TRACEをファイル書き出し

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

学習

適宜追加予定

DBICマニュアル

ここから辿るのがよさそう

    • Cookbookは記述と実際に発行されるSQLが書いてあってわかりやすい.SQLの構文で検索してみるとやり方がわかるかもしれない

〜ここまで読んだ〜

日本語リソース

まとめてあるのは結構少ないー.WEB+DB PRESS Vol.36のnaoyaさんの記事期待

DBIx::Class::Manual::Intro #2

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

DBIx::Class::Manual::Intro #1

http://search.cpan.org/~bricas/DBIx-Class-0.07003/lib/DBIx/Class/Manual/Intro.podの抜き出しメモ.まずスキーマの作成まで

データベースからの情報が絶対に必要になるまでqueryされない.ResultSetするだけではqueryしないよ

ベースとなるschemaクラス

自動で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;

各々のSchemaクラス

#宣言・継承
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

DBIx::Class::Schema::Loaderを使うなら

簡単〜

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