У меня есть проект 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.
Заранее спасибо!