使用 gcloud 查询 google 数据存储时出现索引错误
Index error on querying google datastore using gcloud
我正在尝试为我的非 GAE 应用程序使用 google 数据存储。
为此,我使用 gcloud python 库在数据存储中创建了种类和祖先相关的实体。
还通过 WEB-INF/datastore-indexes 使用 gcd 工具更新了所有类型的数据存储索引配置。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.
这是我的数据存储-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>
我是不是漏了什么?
您的所有索引都设计用于祖先查询(请注意 ancestor=true
)。但是,您的实际查询不会在特定祖先中查询。
为了回答您的特定查询,您需要索引:
<datastore-index kind="event" ancestor="false">
<property name="EvtName" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
或者,如果您确实想要查询具有特定父级的实体,请确保添加带有 Query#hasAncestor(Key parentKey)
的祖先过滤器。
我正在尝试为我的非 GAE 应用程序使用 google 数据存储。
为此,我使用 gcloud python 库在数据存储中创建了种类和祖先相关的实体。
还通过 WEB-INF/datastore-indexes 使用 gcd 工具更新了所有类型的数据存储索引配置。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.
这是我的数据存储-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>
我是不是漏了什么?
您的所有索引都设计用于祖先查询(请注意 ancestor=true
)。但是,您的实际查询不会在特定祖先中查询。
为了回答您的特定查询,您需要索引:
<datastore-index kind="event" ancestor="false">
<property name="EvtName" direction="desc" />
<property name="EventDateTime" direction="desc" />
</datastore-index>
或者,如果您确实想要查询具有特定父级的实体,请确保添加带有 Query#hasAncestor(Key parentKey)
的祖先过滤器。