Google Cloud Datastore能否用IN或包含运算符过滤?新手技术求助
嘿,这个问题我之前也碰到过!Datastore的低级API确实不直接支持IN运算符,但咱们有两种靠谱的解决办法,分情况给你说清楚:
情况1:你用的是App Engine旧版Datastore API(比如
google.appengine.ext.datastore) 旧API里add_filter确实不认IN,这时候得用复合OR过滤器来模拟IN的效果——把每个company_id的等于条件用OR拼起来就行:
from google.appengine.ext.datastore.datastore_query import CompositeFilter, Filter, FilterOperator # 你要筛选的company_id列表 target_company_ids = [1, 5, 7, 12] # 为每个company_id创建一个等于过滤器 filter_list = [] for cid in target_company_ids: filter_list.append(Filter('company_id', FilterOperator.EQUAL, cid)) # 用OR把所有过滤器组合起来 combined_filter = CompositeFilter(FilterOperator.OR, filter_list) # 把复合过滤器绑定到查询上 query.set_filter(combined_filter) # 之后正常fetch数据就行 results = list(query.fetch())
情况2:你用的是新版Google Cloud Datastore Python客户端库(
google-cloud-datastore) 新版库是原生支持IN的,你大概率是写法不对或者版本太老。先确保库是最新的:
pip install --upgrade google-cloud-datastore
然后用正确的方式写查询:
from google.cloud import datastore client = datastore.Client() query = client.query(kind='Score') # 方法1:直接用IN操作符 query.add_filter('company_id', 'IN', [1, 5, 7, 12]) # 方法2:更简洁的__in语法(和Django ORM类似) # query.filter(company_id__in=[1, 5, 7, 12]) # 获取结果 results = list(query.fetch())
重要注意事项
- Datastore的IN操作(不管是模拟的还是原生的)最多支持30个值,如果你的
company_id列表超过30个,得拆分成多个查询(比如每30个一组),然后合并结果(记得去重,不过一般实体不会重复)。 - 如果用旧API,别忘导入
CompositeFilter这些类,不然会报错。
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

