我正在尝试将谷歌数据存储用于我的非GAE应用程序。
为此我使用gcloud python库在数据存储区中创建了种类和祖先相关的实体。
还使用gcd工具通过WEB-INF / datastore-indexes.xml文件更新了所有类型的数据存储区索引配置,并且其状态为“正在服务。”
但是我无法在控制台或使用gcloud lib中成功查询基于索引的列。
以下是查询&回溯
from gcloud import datastore
ds = datastore.Client(dataset_id='XXXXXX')
query = datastore.Query(ds, kind='event')
query.add_filter('EvtName', '=', 'buy')
query.add_filter('EventDateTime', '<=', datetime.datetime(2015, 10, 22, 8, 45))
for itm in query.fetch():
print(dict(itm))
gcloud.exceptions.PreconditionFailed: 412 no matching index found.
这是我的datastore-indexes.xml配置
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
autoGenerate="false">
<datastore-index kind="event" ancestor="true">
<property name="EvtName" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
<datastore-index kind="att" ancestor="true">
<property name="EvtAttName" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
<datastore-index kind="att_val" ancestor="true">
<property name="AttValue" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
<datastore-index kind="user" ancestor="true">
<property name="EventDateTime" direction="desc" />
</datastore-index>
</datastore-indexes>
我错过了什么吗?
答案 0 :(得分:2)
所有索引都设计用于祖先查询(请注意ancestor=true
)。但是,您的实际查询不会在特定的祖先中进行查询。
要回答您的特定查询,您需要索引:
<datastore-index kind="event" ancestor="false">
<property name="EvtName" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
或者,如果您确实想要查询具有特定父级的实体,请确保使用Query#hasAncestor(Key parentKey)
添加祖先过滤器。