参考とりあえず作ったモジュールVERSION-0.05000での記述。http://search.cpan.org/~mstrout/DBIx-Class/ドキュメントも当初に比べれば増えてきたし、そっち見たほうがよかばい。以下は簡単なまとめで。一通り使えるくらいは書きたい。このサイトはWikiなので途中途中に色々追加したり修正したりしますからご注意をDBIx::Class::Schemaを使ってみるこれからDBICではSchemaメインらしい。下の例ではUserテーブルをこのアプリケーションで使うよって感じかね。'DBIx::Class::Schema';__PACKAGE__->load_classes(qw/User/);1;load_classesにテーブル指定しないと、Neko::Schema::*が指定されたとみなす。1__PACKAGE__->load_classes();複数に分かれたスキーマを扱いたい場合はこんな感じ。delete$user->delete;これでUserテーブルに対して操作可能でつ。searchメソッドでfindはプライマリキーに対してのselectなので、searchメソッドで検索条件を指定してみる。$user->id,':',$user->name,"\n";}イテレータで受け取った場合は、nextメソッドとかfirstメソッドでデータを取り出す。CDBIと同じだけど、返りをスカラーで受け取るとイテレータに、配列で受け取ると配列にしたデータを返してくれる。$user->id,':',$user->name,"\n";}でも、これは必要ないデータまでとってきてくれたりするので、イテレータ使うべし。Neko::Schema->connect('dbi:mysql:nekodb','nekokak','******');と、するだけぽい。(1,3,5,7,9)にしてくれるっぽい。9こんなSQLにされてた。5このようなSQLが実行されました。DESC'});ポイントは初めの引数は検索条件になるからorder_byは第二引数にすっこと。],});こんな感じで複雑な検索条件も指定できまつnextメソッド/allメソッドnextメソッドはイテレータ的使い方をするsearchメソッドで複数レコード取ってきて、updateかます例。$user->update;}allメソッドの場合は検索結果の配列を返す。'%neko%'});でも、基本的にsearchメソッドでもできるしsearch使えばいいっぽい。$user->id,':',$user->name,"\n";}$it->page(1);をせずに$itをnextメソッドでガリガリまわすと全て取れる罠。それが嫌な場合はページを指定するべし。$it->page(2);とセットするだけ。$l->last_insert_id,"\n";と、最後にinsertかましたプライマリキーの値をとれる。$l->last_insert_id,"\n";するとちゃんと27が取れてくる。$l->last_insert_id,"\n";当然29が取れますた。$schema->resultset('User');こうすりゃ$u経由でsearchとかでける。$count,"\n";これだけ。'nomaneko'});そう、これだけ。{'like','noma%'}});ただ、これだけ。$user->id,':',$user->name,"\n";}こんな感じでOK。$i++;}ひそかに便利かも。24,name=>"mogeneko1"});レコードが存在しなければinsertしてあればupdateしてくれるスグレモノ。1:多の関係を試す当然これができないと問題外。ちなみにDBIx::ClassのPODは分かりにくかったりする。試すテーブルは初めのuserテーブルとこのbookmarkテーブル。InnoDB;user:bookmark=1:nの関係でつ。Bookmark/);こうする。$user->id,':',$bookmark->id,':',$user->name,':',$bookmark->url,"\n";}Userからの検索とは異なりBookmarkには1つのUserしか存在しない為、$bookmark->user_id;とするだけで、該当のデータが取得される。'http://d.hatena.ne.jp/nomaneko/'});inflate/deflateを試すloginテーブルを作ります。このテーブルはuserテーブルと1対1の関係です。},});userテーブルにマッピングしてたモジュールにリレーションの追加Neko::Schema::Userにmight_haveを追加します。Login/);userテーブルとloginテーブルへのinsertuserテーブルにデータをつっこんでついでにloginテーブルにもデータつっこみます。'2006-02-03'});loginテーブルのselectloginテーブルをselectしてそこからついでにuserのデータも引っぱってます。$login->id,':',$u->name,':',$login->login_time,"\n";}inflate/deflateにはTime::Pieceとかも当然使えます。'w'));で/tmp/trace.outにログが出力されまつ。ログの内容はこんな感じ。nomanekoSQLiteを使うときの注意MySQLでも駄目だったのでプライマリのないテーブルの場合は要注意typesterさんがDBICのMLにDBD::SQLiteの制限に関するやり取りやってたので参考にすべし。$user->id,':',$user->name,"\n";}問題なくデータ取れます。そこでupdateと絡めてやると、たとえばこんなの。17こんな感じのエラーになった。17なんじゃこのエラーは。思ったらどうも、一発目のupdateで一気に全部アップデートかまされてる模様。./test.pl1:nekokak2:nomaneko$とちゃんと想定したデータが取れてきます。user;1|hogeneko2|hogeneko3|hogenekosqlite>こんな感じにされてしまいますた。要注意!!MLの回答を元にオイラの質問:http://lists.rawmode.org/pipermail/dbix-class/2006-February/000672.html回答:http://lists.rawmode.org/pipermail/dbix-class/2006-February/000681.htmlDBICのMLでも、プライマリの無いテーブルは良くないと指摘しつつ、DBICでは現状対応していないと言われました。現状全カラム初回のupdateで更新されてしまう。sqlite>testテーブルへのマッピングをこんな感じにidとnameでプライマリ指定します。$i++;}こんな感じでupdateされます。sub_test2こんなSQLが実行されてしまいます。バージョン0.05003プライマリーの無いテーブルについては一部制限を設けられました。意図しないテーブルのupdateを回避できるのですが。$_->update;}こういうエラーがでます。49そして、全カラムupdateは防がれるようになりました。プライマリの無いテーブルってのも確かにおかしな話なのですが、ありえなくはないので、そういうテーブルをupdateする時は、search()->update();でやりましょう。DBIx::Class::Schema::Loaderを使ってみるPODをほぼそのまま実験してみたDBIx::Class::Schema::Loaderを継承して、DBの設定をする。1,);1;どんな感じになるのかダンプしてみた。リレーションの部分がこちらの想定している形でないので、DBの設定のrelationshipsをやめてみるとこんなんになった。];これはDB設計の問題かなぁ。リレーションの追加は後で考えよう。$user->id,':',$user->name,"\n";}細かい設定をなんとかできたら激しく便利ですな!で、とりあえずこんな感じでリレーション設定できる。$user->id,':',$login->login_time,':',$user->name,"\n";}課題might_haveとhas_oneの違いがよーわからんので調べる。many_to_manyを試す。DBIx::Class::Validationを見る。DBIx::Class::Loaderを試す。DBIx::Class::Schema::Loaderか?参考ほとんどhttp://search.cpan.org/~mstrout/DBIx-Class/lib/DBIx/Class/Manual/SchemaIntro.podからのパクリwとりあえず作ったモジュールDigestColumns::DBIx-Class-DigestColumns-0.01.tar.gz(263)とりあえず作ったから残しておく。Perl5.008008PerlPerl/DBICPerl/DocsTranslationPerl/KittenPerl/forkAdvertisementLand.to。