Python 使用嵌套和/或在Google App Engine中执行祖先查询
我正在使用Google App Engine NDB,并尝试执行以下查询:Python 使用嵌套和/或在Google App Engine中执行祖先查询,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我正在使用Google App Engine NDB,并尝试执行以下查询: query = Club.query(ndb.OR( ndb.AND(Club.memberIds == userId, Club.modifiedDate > date), ndb.AND(Club.activityDate > date, ancestor = userKey) )) 但是,我得到一个运行时错误: TypeError: __new__() got an unexpected keywo
query = Club.query(ndb.OR(
ndb.AND(Club.memberIds == userId, Club.modifiedDate > date),
ndb.AND(Club.activityDate > date, ancestor = userKey)
))
但是,我得到一个运行时错误:
TypeError: __new__() got an unexpected keyword argument 'ancestor'
它与祖先的位置有关。在一个例子中,我们能够指出解决方案,但是这个解决方案在这里不适用,因为祖先在实际AND子句中
是否可以重写查询以使用GQL 编辑 否决我自己的建议。不可能重写查询以使用GQL。GQL不支持
或
见:
建议
如果还将祖先对象修改为模型属性,则可以执行所需的查询。例如
class Club(ndb.Model):
parent = ndb.KeyProperty()
不能将祖先用作筛选器的一部分;它必须是query()调用中直接使用的关键字参数。目前,OR查询已转换为多个查询,因此OR()方法的唯一好处是更容易组合结果。但要实现这一点,您必须按键排序,编写一个合并函数来合并按键排序的两组查询结果是很简单的。(也可以通过调用ndb.query来实现这一点。_MultiQuery()但后者不是一个有文档记录的API,很难正确实现,因此最好自己完成。)但我只想将其添加到查询的第二部分,而不是第一部分。所以我想要或者(query1without祖先,query2with祖先)
是的,我改变了我的建议。我不清楚你是否需要祖先。祖先通常用于建议数据的位置(即建议appengine将该日期存储在同一磁盘上)。这对于为事务处理对数据执行锁定是必要的。这就是你需要的吗?是的,那可能行。我试图对我执行的查询数量小心谨慎,所以我想我可以将它们与and和ORS组合成一个查询,而不是运行两个查询。但显然,我上面的查询运行了两个查询,对吗?我不确定。但是,一般来说,运行查询比获取数据然后自己执行过滤要好。我怀疑祖先必须是query()的参数,而不是and()