3

読書: http://code.google.com/appengine/docs/python/datastore/gqlreference.html

使いたい:

:= で

しかし、それを機能させる方法がわかりません。次のように仮定しましょう

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」演算子だけなので、検索するのは非常に困難な問題です。

4

2 に答える 2

10

キーのリストがあるので、2 番目のクエリを実行する必要はありません。代わりに、バッチ フェッチを実行できます。これを試して:

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

(ガード句さえ必要ないことに注意してください - 0 エンティティの db.get は適切に短絡されます。)

違いは何ですか?まあ、db.get には約 20 ~ 40 ミリ秒かかります。一方、クエリ (GQL であるかどうかに関係なく) は約 160 ~ 200 ミリ秒かかります。しかし、待ってください、それは悪化します!IN 演算子は Python で実装され、シリアルに実行される複数のクエリに変換されます。したがって、10 個のキーに対して IN フィルターを使用してクエリを実行すると、160 ミリ秒程度のクエリ操作を 10 回実行することになり、合計で約 1.6 秒のレイテンシが発生します。対照的に、単一の db.get は同じ効果があり、合計で約 30 ミリ秒かかります。

于 2009-06-17T08:34:16.573 に答える
0

私を正しい軌道に乗せてくれたAdamに+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)
于 2009-06-16T20:03:35.627 に答える