GAEのBigtableから複数の検索結果を取得してみる
例えば下記のようなエンティティがあるとして..
| name | age |
| Spike Spigel | 0 |
| Jet Black | 1 |
| Faye Valentine | 2 |
| Spike Spigel | 3 |
| Jet Black | 0 |
| Faye Valentine | 1 |
| Spike Spigel | 2 |
| Jet Black | 3 |
| Faye Valentine | 0 |
| Spike Spigel | 1 |
ここから
ageが2以上の"Spike Spigel"、
ageが3以上の"Jet Black"、
aqeが2の"Faye Valentine"
を検索し列挙したい場合、上記3つのクエリを実行し、結果を結合する。
a1 = Accounts.all().filter("name =", "Spike Spigel").filter("age >=", 2)
a2 = Accounts.all().filter("name =", "Jet Black").filter("age >=", 3)
a3 = Accounts.all().filter("name =", "Faye Valentine").filter("age ==", 2)
ac = chain(a1,a2,a3)
結合しておけばその後のループ処理などで何かと便利。(特にページングが発生する場合など)
for a in ac:
self.response.out.write(a.name+" age"+str(a.age))
self.response.out.write("
")
念のため付け加えると、
a1 = Accounts.all().filter("name =", "Spike Spigel").filter("age >=", 2)
a1.filter("name =", "Jet Black").filter("age >=", 3)
a1.filter("name =", "Faye Valentine").filter("age ==", 2)
と処理した場合は絞り込み検索になってしまうので、期待する結果は得られない。
MySQLならSQL文で「OR」を使えばOKのはず。
しかしGAEのGQL及びQueryにはそういった機能は無さげなので個別に検索した後、結合しなければならない。
もしかするともっとエレガントな方法があるかもしれないので、ご存知の方がいらっしゃったら是非教えてください。
[追記]
イテレータの結合は標準ライブラリで可能です。
こちらのページが参考になりますよ。
itertools - 効率的なループ処理のためのイテレータ関数
http://www.python.jp/doc/release/library/itertools.html#itertools.chain

