Python Operator中的应用程序引擎数据存储-如何使用?

Python Operator中的应用程序引擎数据存储-如何使用?,python,google-app-engine,gql,google-cloud-datastore,Python,Google App Engine,Gql,Google Cloud Datastore,阅读: 我想使用: :=在 但我不知道如何让它工作。让我们假设如下 class User(db.Model): name = db.StringProperty() class UniqueListOfSavedItems(db.Model): str = db.StringPropery() datesaved = db.DateTimeProperty() class UserListOfSavedItems(db.Model): name = db.Re

阅读:

我想使用:

:=在

但我不知道如何让它工作。让我们假设如下

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")
但有些不对劲…有什么想法吗?是(我在做日常工作,所以现在无法测试):


旁注:搜索是一个非常困难的问题,因为我真正关心的是“IN”操作符。

+1感谢Adam让我走上了正确的轨道。基于他的指针,并在代码搜索中进行一些搜索,我有以下解决方案

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)

因为您有一个键列表,所以不需要进行第二次查询,而是可以进行批量获取。试试这个:

#and this should get me the items that a user saved
useritems = db.get(saveditemkeys)
(注意,您甚至不需要guard子句-0实体上的db.get被适当地短路。)


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

这是一个非常好的答案……今晚我将实现它。我让代码正常工作(是的!),这样以后就可以进行优化了。:)现在我在研究正则表达式。砰砰。头。在…上Brandon-我使用一个名为regexbuddy的应用程序,这很有帮助。与他们没有任何联系。
#and this should get me the items that a user saved
useritems = db.get(saveditemkeys)