Google App Engine ndb Простой запрос дает NeedIndexError - PullRequest
0 голосов
/ 28 июня 2019

У меня есть проект 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: не найдено соответствующего индекса.
Предлагаемыйиндекс для этого запроса:
- вид: данные
свойства:
- имя: timeStamp


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

ОШИБКА: (gcloud.datastore.indexes.create) Сервер ответил кодом [400]:
Неверный запрос Неожиданный статус 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) инажмите на вкладку «Хранилище данных», в которой утверждается, что я использую «Cloud Firestore в основном режиме», и дает мне ссылку на вкладку «Firestore».Когда я иду туда, я вижу все свои данные в Firestore.Все это происходит, хотя я использую python2 и API ndb для доступа к Cloud Datastore / Firestore.
Кроме того, когда я нажимаю на страницу индекса на вкладке Firestore, GCP заявляет, что все мои поля проиндексированы для простых запросов.
Наконец, 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 Ответ

1 голос
/ 28 июня 2019

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

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 и API Cloud Datastore, вам нужно будет создать новый проект и выбрать Cloud Firestoreв режиме хранилища данных, когда вы создаете базу данных .

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

...