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

由于您有一个键列表,因此您不需要进行第二次查询 - 您可以进行批量提取。试试这个:

#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 中实现,并转换为多个查询,这些查询是串行执行的。因此,如果您使用 IN 过滤器对 10 个键进行查询,您将执行 10 次单独的 160 毫秒查询操作,总共大约 1.6 秒的延迟。相比之下,单个 db.get 将具有相同的效果,总共需要大约 30 毫秒。

于 2009-06-17T08:34:16.573 回答
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)
于 2009-06-16T20:03:35.627 回答