2012-09-25
Kappa の飼い方(Kappa という ORM の話) その4 select 系いろいろ
こんばんはこんばんは。 今週末は「Perl のお祭り」こと YAPC::Asiaですね!皆様、見る方も発表する方も準備は万全でしょうか?
(私?お察しください。。。資料はちょっとずつ書いてるよ!)
ここで宣伝。Perl と SQL のいろいろ というタイトルでお話させていただきます。裏番組がどちらも大変なビッグネームなので恐縮なのですが、初中級者くらい向けに Perl と SQL にまつわる話を させていただこうと思っております。
(※ここまでテンプレ)
Kappa という ORM の話。今日は select にまつわる色々です。
目次
- その1 開発の背景のお話
- その2 インストールとかのお話
- その3 基本操作
- その4 select 系いろいろ
- その5 Row オブジェクトの基本
- その6 Row オブジェクトのカスタマイズ
- その7 テーブルクラスとそのカスタマイズ
- その8 雑多な話
- その9 SQL をテーブルクラスに置く
事前準備
テーブルを作っておきましょう。前回作ってれば作らなくていいです。
データも入れといてくださいね。(これも前回入れてる人は入れなくていいです。)
select 系のいろいろ
select 系は、メソッドがいっぱいありますが、一定のルールになっているので、慣れれば分かるようになると思います。基本的には、4タイプの戻り値指定と、4タイプの select 方法の組み合わせです。
戻り値指定の4タイプ
- select
- select_row
- select_all
- select_itr
戻り値指定は上記の4種があります。
select はコンテキストに応じて 1レコード or 全レコードを返します。
で、select_row系 は、この1レコードを返すタイプです。前回もちょっとだけ説明しましたが、1レコード分の値は row_object_enable が TRUE なら Row オブジェクトが返り、FALSE なら hashref(fetchrow_hashref の値)が返ります。
select_all系 は全レコードを返すタイプです。配列が返り、配列の1要素は、row の場合と同じです。(row_object_enable に応じて変わります。)
select_itr系 はイテレータを返します。イテレータは next() ってメソッドだけが使えます。next を呼ぶと、1行分データ(Row オブジェクト or hashref)が 返ります。
select 方法の4タイプ
- select
- select_*_with_fields
- select_*_by_sql
- select_*_named
一番シンプルな select はとくに説明しなくても分かるかと思います。テーブル名と条件を指定します。
with_fields は select と似てますが、引数に select 対象のカラムを指定できます。たとえば、select_row_with_fields だと こんな感じです。
この例だと、id だけ取るので、name は取れません。ビューとかに select する場合にハイコストな計算が走る行を除外したい時とかに 使うと良いと思います。
by_sql は、テーブル名ではなく、SQL を指定します。プレースホルダを使います。
第2引数は配列ではなく、配列リファレンスで bind する値を指定します。(配列ではなく、配列リファレンスなのは、第3引数としてテーブル名を指定したい ためです。テーブル名は Row オブジェクトの紐付けに使うので重要です。)
named なやつは、by_sql に似ていますが、名前つきプレースホルダが使えます。(これもテーブル名ではなく、SQL を指定するタイプです)
何となくわかったでしょうか?
たとえば select_itr_named なら、「イテレータを返して、名前つきプレースホルダの SQL を使うやつ」です。select_all_by_sql なら、「配列を返して、(名前なしの)プレースホルダの SQL を使うやつ」です。select_row_with_fields なら、「1行を返して、指定したテーブルの、指定したフィールドを返すやつ」です。
まとめ
今回は select 系のメソッドを紹介してみました。探偵さんの名前は覚えましたか?これは重要なファクターですよ! (このネタ、どこまでどの程度通じてるのかよく分かりませんが、マイブームなので続けますよ!)
次回は Row オブジェクトを紹介しようかなー。