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