2009-06-16 11 views
3

読書:http://code.google.com/appengine/docs/python/datastore/gqlreference.htmlオペレーターのApp Engine Datastore - 使い方は?

私が使用したい:

:=

ではなく、それを動作させるために方法がわからないと思います。次のことを仮定しましょう

class User(db.Model): 
    name = db.StringProperty() 

class UniqueListOfSavedItems(db.Model): 
    str = db.StringPropery() 
    datesaved = db.DateTimeProperty() 

class UserListOfSavedItems(db.Model): 
    name = db.ReferenceProperty(User, collection='user') 
    str = db.ReferenceProperty(UniqueListOfSavedItems, collection='itemlist') 

ユーザーの保存済みアイテムのリストを取得するにはどうすればよいですか?明らかに私はできる:

q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name) 

しかし、それは私に鍵のリストを取得します。私は今、そのリストを取得して、UniqueListOfSavedItemsからstrフィールドを取得するためのクエリを取得します。私は私ができると思った:

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q") 

しかし、何かが正しくない...任意のアイデア?それは(私の一日の仕事で午前、今これをテストすることはできません)です:

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q) 

サイドノート:私は本当に気にすべてが「IN」オペレータであるため、どのような悪魔困難な問題が上を検索します。

答えて

9

キーのリストがあるので、2回目のクエリは必要ありません。代わりにバッチフェッチを行うことができます。

違いは何ですか、あなたが求めることができる -

#and this should get me the items that a user saved 
useritems = db.get(saveditemkeys) 

(。0実体上のdb.getがappropritely短絡であるあなたも、ガード句は必要ありません):これは試してみてください? db.getには約20〜40msかかります。一方、クエリ(GQLかどうか)は約160〜200msかかります。しかし、待って、それは悪化する! IN演算子はPythonで実装され、連続して実行される複数のクエリに変換されます。したがって、10個のキーのINフィルタを使用してクエリを実行すると、10回の別々の160ms-ishクエリ操作が実行され、合計約1.6秒の遅延が発生します。対照的に、1つのdb.getは同じ効果を持ち、合計約30msかかるでしょう。

+0

すてきな答え...私は今夜これを実装します。私はコードが動作している(ええ!)最適化が後で来るようにする。 :)今は正規表現です。強打。頭。に。キーボード。 –

+1

Brandon - 私はregexbuddyというアプリを使用しています。いかなる方法でもそれらに関連していない。 –

0

アダムが正しい軌道に乗るために+1。彼のポインタに基づいて、コード検索でいくつかの検索をして、私は以下の解決策を持っています。

usersaveditems = User.Gql(“Select * from UserListOfSavedItems where user =:1”, userkey) 

saveditemkeys = [] 

for item in usersaveditems: 
    #this should create a list of keys (references) to the saved item table 
    saveditemkeys.append(item.str())  

if len(usersavedsearches > 0): 
    #and this should get me the items that a user saved 
    useritems = db.Gql(“SELECT * FROM UniqueListOfSavedItems WHERE __key__ in :1’, saveditemkeys) 
関連する問題