GAEのBigtableから複数の検索結果を取得してみる

例えば下記のようなエンティティがあるとして..

nameage
Spike Spigel0
Jet Black1
Faye Valentine2
Spike Spigel3
Jet Black0
Faye Valentine1
Spike Spigel2
Jet Black3
Faye Valentine0
Spike Spigel1

ここから
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にはそういった機能は無さげなので個別に検索した後、結合しなければならない。
もしかするともっとエレガントな方法があるかもしれないので、ご存知の方がいらっしゃったら是非教えてください。

[ソースをDownload]

[追記]
イテレータの結合は標準ライブラリで可能です。
こちらのページが参考になりますよ。
itertools - 効率的なループ処理のためのイテレータ関数

http://www.python.jp/doc/release/library/itertools.html#itertools.chain

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/325

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.