Bra*_*son 3 python google-app-engine gql google-cloud-datastore
阅读: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')
Run Code Online (Sandbox Code Playgroud)
如何进行查询以获取用户保存的项目列表?显然我可以这样做:
q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name)
Run Code Online (Sandbox Code Playgroud)
但这给我一个关键列表.我现在想要获取该列表并将其放入查询中以从UniqueListOfSavedItems中获取str字段.我以为我能做到:
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q")
Run Code Online (Sandbox Code Playgroud)
但是有些事情不对......任何想法?是(我在我的日常工作,所以现在不能测试):
q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q)
Run Code Online (Sandbox Code Playgroud)
旁注:要搜索的是一个非常难以解决的问题,因为我真正关心的是"IN"运算符.
Nic*_*son 10
由于您有一个键列表,因此您无需进行第二次查询 - 您可以进行批量提取.试试这个:
#and this should get me the items that a user saved
useritems = db.get(saveditemkeys)
Run Code Online (Sandbox Code Playgroud)
(注意,你甚至不需要保护子句 - 0个实体上的db.get被适当地短路.)
你可能会问,有什么区别?好吧,db.get需要大约20-40ms.另一方面,(GQL与否)查询大约需要160-200ms.但等等,它变得更糟!IN运算符在Python中实现,并转换为多个查询,这些查询是串行执行的.因此,如果您使用IN过滤器对10个密钥进行查询,那么您将执行10次单独的160ms-ish查询操作,总共大约1.6秒的延迟.相比之下,单个db.get将具有相同的效果,总共需要大约30ms.
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |