App Engine数据存储IN运算符 - 如何使用?

3

阅读:http://code.google.com/appengine/docs/python/datastore/gqlreference.html

我想使用:

:= IN

但我不确定如何让它起作用。 假设以下内容:

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”运算符。

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或非GQL)需要大约160-200毫秒。但是等等,情况变得更糟了!IN运算符在Python中实现,并转换为多个序列执行的查询。因此,如果您使用带有10个键的IN过滤器进行查询,则会执行10个单独的约160毫秒的查询操作,总延迟时间约为1.6秒。相比之下,一个单一的db.get将具有相同的效果,并且总共需要约30毫秒。


多好的答案啊...我今晚会实现它。 我让代码运行起来了(耶!),所以优化可以稍后处理。 :) 现在我正在使用正则表达式。不停地敲键盘。 - Brandon Watson
1
Brandon - 我使用一个叫做regexbuddy的应用程序,它非常有帮助。与他们没有任何关联。 - Richard Watson

0
+1 给予 Adam,因为他让我找到了正确的方向。根据他的指引,并在 Code Search 上进行了一些搜索,我得出了以下解决方案。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接