amari3のはてなダイアリー このページをアンテナに追加 RSSフィード Twitter

2011-12-02

[][][]Teng で検索あれこれ

前回までの説明で、Teng を何となく使えるようになると思う。今回は Teng が提供する検索メソッドについて触れてなかった箇所についての説明をする。

Teng の検索メソッド

以下の4つのメソッドが提供されている。

  • Teng#search
  • Teng#single
  • Teng#search_named
  • Teng#search_by_sql

上2つのメソッドは、Teng で CRUD をしてみる - amari3のはてなダイアリー で説明しているのでこちらを参照ください。

また、説明に使用するテーブルやスキーマ等は、こちら Teng でリレーションを使う方法 - amari3のはてなダイアリー と同じものです。

Teng#search_named メソッド

Teng#search_named メソッドは生(に近い)SQL を記述する時に便利なメソッド。Teng::Iterator オブジェクトが返ってくる。

サンプルコードです。

my $it = $teng->search_named(
    q{SELECT * FROM entry WHERE ( id IN :ids )},
    +{ ids => [2, 4] }
);

少し見慣れない表記が含まれているけど、実際には以下の様な SQL 文になる。

SELECT * FROM entry WHERE ( id IN ( ?,? ) )
bind [2,4]

IN 演算子の値の個数が動的に変わる場合でも、呼び出し側は意識せずに利用できて便利。

Teng#search_by_sql メソッド

Teng#search_by_sql メソッドは生 SQL 文を記述することができる。Teng::Iterator オブジェクトが返ってくる。

サンプルコードです。

my $it = $teng->search_by_sql(
    q{SELECT * FROM entry WHERE id > ?},
    [ 2 ]
);

普通に SQL 文が記述できるので、難しいところは無いと思う。

どんな時に使うのか

今回例示したケースでは使う必要は無いと考える。主に以下の様なケースで使うといいと思う。

  • 集計バッチ等で複雑な SQL 文を記述する必要があるとき

Teng で WHERE 句の条件やソート条件

ここからは Teng で WHERE 句の条件の記述方法やソート条件の記述方法を説明をする。Teng でと銘打ってはいるけど、Teng のクエリビルダである SQL::Maker の機能の説明になるので、SQL::Maker のドキュメントもあわせて読むのが良いでしょう。

BETWEEN 演算子を使う

範囲検索でよく使う BETWEEN 演算子の記述方法です。

my $it = $teng->search(entry => +{ id => +{ between => [2, 4] } });

カラム名に、ハッシュリファレンスで条件を記述することになる。難しいところは無いと思う。『>』や『!=』等も基本的には同じように記述する。

ORDER BY 句を使う

検索結果のソートをする、order by の記述方法です。

my $it = $teng->search(entry => +{ id => +{ '>' => 2 }}, +{ order_by => 'id DESC' });

Teng#search メソッドの第3引数に記述することで実現できる。こちらも難しいところは無いと思う。

最後に

今回は検索メソッドについて、少しだけ踏み込んだ説明をしました。複雑な検索方法も分かってきたので、業務や趣味プログラムでそろそろ使いたいと思います。