我有这个实体模型:
class ApartCILabel(ndb.Model):
project_id = ndb.IntegerProperty(indexed=True)
changeset_ids = ndb.IntegerProperty(repeated=True, indexed=True) # ApartCIChangeset IDs
# other properties
我最近为这些实体添加了一种新的查询类型:
keys = ApartCILabel.query(ApartCILabel.project_id == self.db_data.project_id,
ApartCILabel.changeset_ids == self.key_id).fetch(keys_only=True)
if keys:
label = Label(db_key=keys[0], handler=self.handler)
logging.debug('label found: %s' % label.name)
else:
logging.error('label for %s not found' % self.lid)
我知道我需要一个综合索引,所以我在
dev_appserver.py
,用于自动更新
index.yaml
文件我在日志中看到调试消息,表明查询成功:
DEBUG 2018-02-20 23:56:11,720 ci_changeset.py:70] label found: ACI_COPY_OF_SMALL_180221_1
令我惊讶的是,我的
指数亚马尔
文件好的,自从上次我需要索引更新(运行)以来,我确实更新了我的GAE SDK
1.9.65
现在),也许我在所有服务中共享索引定义文件时使用的基于符号链接的方案会产生某种干扰。没问题,我将在GAE上部署更改,并在那里看到丢失的复合索引错误。
再次令人惊讶的是:查询成功,没有错误。
我检查了我的
指数亚马尔
文件,这种类型的唯一复合索引是:
- kind: ApartCILabel
properties:
- name: project_id
- name: created
direction: desc
我在开发人员控制台中仔细检查了数据存储索引,正如我所料,它与
指数亚马尔
文件:
我甚至在开发人员控制台中执行了手动查询,这也需要一个复合索引。同样成功的还有:
如果没有复合索引,这种查询怎么可能正常工作?我错过了什么?
更新:
几个小时后,我执行了另一个类似的手动查询,结果同样正确,但这次
Your Datastore does not have the composite index (developer-supplied) required for this query.
错误(或者我应该称之为警告?)出现时间: