DBIC

データを返すようなモデルメソッドのテストはfixtureだ

ロジックや、booleanとか値を返すようなメソッドのテストは書けるようになった。 データベースからの問い合わせ結果、DBICでいうResultSetを返すようなメソッドではどう書けばいいか分からなかった。 ということをTwitterでぼやいたら天から神の声が降ってき…

DBICでinnerとかleftとかrightとかのjoinをする

わかりづれえ。UserがBooksをhas_manyで、BookがUserにbelongs_toなとき、つまりUser has_many Bookで、Book belongs_to Userなとき、bookからselectかけたらただのjoin、つまりinner joinになる。 そりゃ当然だ。親が確実にいるからこそ子供は居る。 で、us…

今度はDBICでUser->find_by('age', 1)とかUser->find_all_by('user_id', 1)とかやってみた

DBICでUser->find_by_id(1)とかやってみたのブランチだか改良みたいな。 after # 検索結果は1件 my $user_a = User->find(3); # select 〜 where user.id = 3 my $user_b = User->find_by('age', 3); # select 〜 where user.age = 3 # 検索結果はn件 my $bo…

DBICでUser->find_by_id(1)とかやってみた

追記 改良版書きました DBICでUser->find_by('age', 1)とかUser->find_all_by('user_id', 1)とかやってみた catalystアプリの中で、DBICを使ってDBに問い合わせする部分をActiveRecordっぽくしてみた。 before my $user = $c->model('DBIC::Users')->search(…

dbicでバルクインサート

1個のデータを作るcreateを100回するより、100個のデータを作るcreateを1回の方が早い。 これをバルクインサートと言う、と。 んでdbicでやるわけで。 for (1..100) { my $length = int(rand(20)) + 1; my $str = String::Random->new->randpattern('.' x $l…

dbicのバグ

resultset_attributesはsearchの初期設定ができる。 んが、joinとかしたときにエイリアスがひどいことになる。 と神から教わった。 俺の最低な対策:テーブルごとに固有の名前のカラム作る いや、回避できるけどさすがにしたくないよ

updateするときにjoinできるテーブルはupdateするテーブルのみ

あれこれjoinしてupdateしても希望通りには動かないので注意

大量にcreateするとき

100個のデータを作成するとき、create文を100回投げる必要はなくて、1回で済む。これをバルクインサートというそうだ。知りませんでした。 で、DBICでそれやるときはpopulateすればいいそうだ。 注意点として、全カラムの値を指定する必要がある。そうしない…

DBICでトランザクション処理

複数のCRUDを行うとき、例えば100件のデータをinesrtするとき。20件までは成功したけど、残り80件はなんかプログラムエラーで入らなかった、なんてことになったら困るので、一連の処理が全て成功して初めてDBにコミットする、てゆーのがトランザクション。 …

$c->model

DBICでDB参照するとき、 $c->model('DBIC::User')->search とかやってるわけだけど、 $c->model('User')->search とか書くこともできるっちゃできる。なんか注意点があるけど今度追記する 追記: 神「その書き方はModelが複数あるときにdefault_modelを定義…

searchの中の引数を条件によって変えたいけどif文使うの嫌だなーとかって

search( { ($hoge =~ /hoge/ ? ('ho.ge' => 1) : ()), }, { ($foo =~ /foo/ ? ('bar' => 'foo') : ()), } );

searchとかかけて返ってくるのはResultSetで、rsにnextとかかけて返ってくるのがResultClass rsにget_columnをかけたらResultSetColumnっていうクラスのインスタンスが返ってくる rcにget_columnをかけたらその行のそのカラムの値が返ってくる get_columnはr…

dbicでレプリケーション

DBIx/Class/Storage/DBI/Replication

1件searchの結果はfirstじゃなくてnextで受け取れ

findがtrue | falseを返すのに対して、searchが問答無用でtrueを返すので、検索結果がtrue | falseなとき、(例えば0件か1件しか無いとき)の判断。 今まではfirstの有無で判断してたけど、これはsearch条件にjoinを使っていた場合に、せっかく用意したrsが…

検索エンジンとかのAND検索ってどーなってんだろう

こんなんでいいのかなあ foreach my $k (@key) { $query .= "name like ? AND "; push @data,"%$k%"; } $query = substr ($query,0,-5); my $rs = $c->model('DBIC::table')->search_literal($query,@data); きっとこれも頭悪い方法なんだろう…

一気にうpだて

$c->model('DBIC::table')->search({hoge => 'foo'})->update({pass=>'PASS'}); 基本なんだけどさぁ調べればすぐ分かるんだけどさぁ 知る前はwhileで回して一件ずつupdateかましてた。ばかす

webアプリで行うDBの操作に、普通は新規登録と編集がある。 そのときに、名前やら何やら、uniqueでなければならない項目が(普通は)ある。 新規登録時には既にその値がDBに存在しないかをチェックし、編集時には自分以外でその値がDBに存在しないかチェック…

作成日時と更新日時を自動で入れよう

ActiveRecordなるRubyのORマッパ(だったか)では、created_atとupdatet_atというカラムをDBに作っておくと、データの作成日時と更新日時を自動で入れてくれるそうな。 DBICにもあると以前教えてもらった。DBIx::Class::InflateColumn::DateTime::Autoってモ…