无法在Google数据存储区上应用投影查询。错误:找不到匹配的索引

时间:2017-07-27 06:27:03

标签: python google-cloud-datastore

我是Google Datastore的新手,并且关注此Google文档。

https://cloud.google.com/datastore/docs/datastore-api-tutorial

我已经通过阅读此文档来完成了调用Google API的授权。

https://developers.google.com/identity/protocols/application-default-credentials#callingpython

我只有两个文件:

1. client_secret.json
2. datastoreConnection.py

这是我的datastoreConnection.py直到现在:

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/path/to/client_secret.json'

from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
from google.cloud import datastore

client = datastore.Client(project ="xyz",namespace = "staging")

def list_tasks(client):
    query = client.query(kind='testData')
    query.projection = ['patientName']
    return list(query.fetch(limit=10))

print(list_tasks(client))

此代码工作正常,并返回所需的数据。

当我使用多个属性应用Projection时会出现问题。 e.g

query.projection = ['patientName','age']

代码给了我错误:

google.cloud.exceptions.PreconditionFailed: 412 no matching index found. recommended index is:<br/>- kind: testData<br/>  properties:<br/>  - name: age<br/>  - name: patientName<br/>

为了进行投影查询,我读了这个。 https://cloud.google.com/datastore/docs/concepts/queries#datastore-projection-query-python

我已经交叉检查了属性名称,但仍然有相同的错误。 我该如何解决这个问题?

我在其他与此类问题相关的问题中看到了index.yaml文件。这有必要使用吗?它有什么好处?

1 个答案:

答案 0 :(得分:1)

每当您需要检索多个属性而不是所有属性(*)时,您需要具有匹配的复合索引。在这种情况下,您需要患者姓名和年龄属性的综合索引。您可以使用index.yaml文件或gcloud命令行工具创建复合索引。以下文档可以帮助您:

https://cloud.google.com/datastore/docs/concepts/indexes