阅读: 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”,所以要搜索的是一个非常难以解决的问题。操作

有帮助吗?

解决方案

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

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

(注意你甚至不需要保护子句 - 0个实体上的db.get被适当地短路。)

你可能会问,有什么区别?好吧,db.get需要大约20-40ms。另一方面,(GQL与否)查询大约需要160-200ms。但等等,它变得更糟! IN运算符在Python中实现,并转换为多个查询,这些查询是串行执行的。因此,如果您使用IN过滤器对10个密钥进行查询,那么您将执行10次单独的160ms-ish查询操作,总共大约1.6秒的延迟。相比之下,单个db.get将具有相同的效果,总共需要大约30ms。

其他提示

为了让我走上正轨,给了亚当+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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top