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