如何在Datastore模式的Firestore中使用Keys执行IN查询
问题原因与解决方案
问题根源在于App Engine老版db模块的GQL语法和Cloud控制台的Firestore Datastore模式GQL语法不兼容,两者规则存在差异:
- 第一个写法报错:
db.GqlQuery不支持Key(<kind>, <ID>)这种函数式键引用,老API的GQL必须用__key__指代实体键,同时IN子句的结构也不符合老GQL要求。 - 第二个写法报错:老GQL中IN子句的正确格式是
属性 IN :参数,你把参数和字段的顺序写反了,而且也没使用正确的键属性__key__。
正确写法
根据你的需求,分两种场景处理:
场景1:references是已构造好的db.Key对象列表
直接将键列表作为参数传入,使用__key__属性匹配:
g = db.GqlQuery("SELECT * FROM <kind> WHERE __key__ IN :1", references)
场景2:references是ID字符串/数字列表
先将ID转换为db.Key对象,再执行查询:
# 先转换ID为Key对象 key_list = [db.Key("<kind>", item) for item in references] # 执行查询 g = db.GqlQuery("SELECT * FROM <kind> WHERE __key__ IN :1", key_list)
补充说明
Cloud控制台的GQL是基于Firestore Datastore模式的语法,支持Key()函数和X in Y的写法;而老版db模块的GQL遵循传统App Engine Datastore的语法规则,仅支持__key__指代键,且IN子句必须以属性 IN :参数的形式传递列表参数。
内容的提问来源于stack exchange,提问作者Mavese
相关产品推荐
相关产品推荐

