Простой запрос ndb Google App Engine выдает ошибку NeedIndexError

У меня есть проект Google App Engine, который использует python 2.7 и Cloud Datastore (ну, это может быть Cloud Firestore, но об этом позже). Моя проблема в том, что когда я делаю простой запрос, например Data.query(ndb.AND(Data.timeStamp >= day, Data.timeStamp < day + datetime.timedelta(days=1))).order(Data.timeStamp) Я получаю 500 (ошибка сервера) и эту ошибку в журналах:

NeedIndexError: соответствующий индекс не найден.
Предлагаемый индекс для этого запроса:
- kind: Data
свойства:
- name: timeStamp


Предлагаемый индекс является индексом для простого запроса. Если я добавлю этот запрос в файл index.yaml и запустил gcloud datastore indexes create index.yaml, я получаю следующее сообщение:

ОШИБКА: (gcloud.datastore.indexes.create) Сервер ответил кодом [400]: < br> Неверный запрос Неожиданный статус HTTP 400.
Не удалось создать составной индекс для entity_type: "Data"
Свойство {
name: "timeStamp"
direction: ASCENDING
}
ancestor : false
: Этот индекс: IndexDef {semantics = DATASTORE, kind = Data, indexAncestor = NONE, propertyDefs = [PropertyDef {path = timeStamp, mode = ORDERED, direction = ASCENDING}]}
не требуется, поскольку Встраиваются индексы с одним свойством.


Поэтому я не могу выполнить этот запрос, потому что мне нужен индекс, но мне не разрешено создавать индекс. У меня вопрос: как выполнить этот запрос?

Дополнительная информация:
Не уверен, но это может быть актуально: когда я захожу в Google Cloud Console (console.cloud.google.com) и нажмите на вкладку Datastore, там утверждается, что я использую «Cloud Firestore в основном режиме», и дается ссылка на вкладку Firestore. Когда я иду туда, я вижу все свои данные в Firestore. Все это происходит, хотя я использую python2 и ndb api для доступа к Cloud Datastore / Firestore.
Кроме того, когда я нажимаю на страницу индекса на вкладке Firestore, GCP утверждает, что все мои поля индексируются для простых запросов. < br> Наконец, dev_appserver.py не сгенерировал для меня индекс в файле index.yaml (как и ожидалось).

Вот мой код:
main.py

import datetime
from google.appengine.ext import ndb

class Data(ndb.Model):
    timeStamp = ndb.DateTimeProperty(indexed=True)


#WSGI compatible function
def app(env, startResponse):

    headers = [('Content-type', 'text/plain')]
    status = "200 OK"

    path = env["PATH_INFO"]

    if path == "/doData":

        Data(timeStamp = datetime.datetime.now()).put()

        startResponse(status, headers)
        return ["done"]


    elif path == "/getData":

        day = datetime.datetime.strptime("2019-06-28", "%Y-%m-%d")

        records = Data.query(ndb.AND(Data.timeStamp >= day, Data.timeStamp < day + datetime.timedelta(days=1))).order(Data.timeStamp).fetch(10)
        print(records)

        startResponse(status, headers)
        return [str(record.timeStamp) + "\n" for record in records]


    startResponse("404 NOT FOUND", headers)
    return ["404 Page Not Found"]


app.yaml:

runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /.*
  script: main.app


index.yaml:

indexes:

- kind: Data
  properties:
  - name: timeStamp

# AUTOGENERATED

# This index.yaml is automatically updated whenever the dev_appserver
# detects that a new type of query is run.  If you want to manage the
# index.yaml file manually, remove the above marker line (the line
# saying "# AUTOGENERATED").  If you want to manage some indexes
# manually, move them above the marker line.  The index.yaml file is
# automatically uploaded to the admin console when you next deploy
# your application using appcfg.py.


Заранее спасибо!




Ответы (1)


Дополнительная информация действительно актуальна. Ваш проект использует Cloud Firestore в собственном режиме, а не Cloud Firestore в режиме Datastore:

When I go into the Google Cloud Console and click on the Datastore tab it claims that I use "Cloud Firestore in Native mode" and gives me a link to the Firestore tab.

Если вы хотите использовать NDB и Cloud Datastore API, вам необходимо создать новый проект и выбрать Cloud Firestore в режиме Datastore, когда вы создайте свою базу данных.

Если вы продолжите использовать этот проект, вам следует использовать одну из клиентских библиотек Cloud Firestore вместо этого.

person Juan Lara    schedule 28.06.2019