DBIC
ロジックや、booleanとか値を返すようなメソッドのテストは書けるようになった。 データベースからの問い合わせ結果、DBICでいうResultSetを返すようなメソッドではどう書けばいいか分からなかった。 ということをTwitterでぼやいたら天から神の声が降ってき…
わかりづれえ。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_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('age', 1)とかUser->find_all_by('user_id', 1)とかやってみた catalystアプリの中で、DBICを使ってDBに問い合わせする部分をActiveRecordっぽくしてみた。 before my $user = $c->model('DBIC::Users')->search(…
1個のデータを作るcreateを100回するより、100個のデータを作るcreateを1回の方が早い。 これをバルクインサートと言う、と。 んでdbicでやるわけで。 for (1..100) { my $length = int(rand(20)) + 1; my $str = String::Random->new->randpattern('.' x $l…
resultset_attributesはsearchの初期設定ができる。 んが、joinとかしたときにエイリアスがひどいことになる。 と神から教わった。 俺の最低な対策:テーブルごとに固有の名前のカラム作る いや、回避できるけどさすがにしたくないよ
あれこれjoinしてupdateしても希望通りには動かないので注意
100個のデータを作成するとき、create文を100回投げる必要はなくて、1回で済む。これをバルクインサートというそうだ。知りませんでした。 で、DBICでそれやるときはpopulateすればいいそうだ。 注意点として、全カラムの値を指定する必要がある。そうしない…
複数のCRUDを行うとき、例えば100件のデータをinesrtするとき。20件までは成功したけど、残り80件はなんかプログラムエラーで入らなかった、なんてことになったら困るので、一連の処理が全て成功して初めてDBにコミットする、てゆーのがトランザクション。 …
DBICでDB参照するとき、 $c->model('DBIC::User')->search とかやってるわけだけど、 $c->model('User')->search とか書くこともできるっちゃできる。なんか注意点があるけど今度追記する 追記: 神「その書き方はModelが複数あるときにdefault_modelを定義…
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…
DBIx/Class/Storage/DBI/Replication
findがtrue | falseを返すのに対して、searchが問答無用でtrueを返すので、検索結果がtrue | falseなとき、(例えば0件か1件しか無いとき)の判断。 今まではfirstの有無で判断してたけど、これはsearch条件にjoinを使っていた場合に、せっかく用意したrsが…
こんなんでいいのかなあ 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); きっとこれも頭悪い方法なんだろう…
$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ってモ…