Я в процессе обновления приложения python2 .7 gae std до python3 .7. Все отлично, за исключением того, что мои индексы просто не работают.
У меня есть простой на вид файл index.yaml:
indexes:
- kind: Response
ancestor: yes
properties:
- name: __key__
direction: desc
И когда я запускаю определенные команды, я получаю это
google.api_core.exceptions.FailedPrecondition: 400 no matching index found. recommended index is:
- kind: Response
ancestor: yes
properties:
- name: __key__
direction: desc
Я использую команду для запуска dev_appserver: dev_appserver.py --application=my_project_id app.yaml
. Мой файл index.yaml находится в том же каталоге, что и мой файл app.yaml.
Больше ничего не запущено. Само приложение - это Flask api, ошибка вылезает когда я curl
одна из конечных точек.
То, что пробовал
после тыка вокруг документов и SO, кажется, мне может потребоваться запустить эмулятор хранилища данных локально. Итак, убедитесь, что мои компоненты gcloud обновлены:
gcloud beta emulators datastore env-init
# which gave me:
export DATASTORE_DATASET=firestore-datastore-280307
export DATASTORE_EMULATOR_HOST=::1:8608
export DATASTORE_EMULATOR_HOST_PATH=::1:8608/datastore
export DATASTORE_HOST=http://::1:8608
export DATASTORE_PROJECT_ID=firestore-datastore-280307
# then
gcloud beta emulators datastore start --project=my_project_id
# which gave me
stuff...
[datastore] API endpoint: http://::1:8679
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore]
[datastore] export DATASTORE_EMULATOR_HOST=::1:8679
[datastore]
[datastore] Dev App Server is now running.
Итак, объединяя эти выходные данные, похоже, что моя среда должна быть такой:
export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id
Cool. Поэтому я оставляю эмулятор запущенным и пытаюсь подключить к нему свой dev_appserver:
export DATASTORE_DATASET=my_project_id
export DATASTORE_EMULATOR_HOST=::1:8679
export DATASTORE_EMULATOR_HOST_PATH=::1:8679/datastore
export DATASTORE_HOST=http://::1:8679
export DATASTORE_PROJECT_ID=my_project_id
dev_appserver.py --application=my_project_id app.yaml
Он запускается, но когда я curl
моя конечная точка, я получаю ту же ошибку индекса.
Итак, я убиваю dev_appserver и пробую это так:
# same env vars as before
dev_appserver.py --support_datastore_emulator=true --application=my_project_id app.yaml
Затем я получаю новую ошибку:
RuntimeError: Cannot use the Cloud Datastore Emulator because the packaged grpcio is incompatible to this system. Please install grpcio using pip
Я установил grpcio в python2 .7 env, чтобы получить над этой ошибкой. Теперь вроде все работает. Но я все еще получаю ошибку отсутствующего индекса.
И еще одна странная вещь: если я go на http://localhost:8000
и попытаюсь перейти к чему-нибудь, что связано с хранилищами данных, я получу такие ошибки, как:
ConnectionError: Cannot connect to Cloud Datastore Emulator on ::1:{THE_PORT}
Что очень странно.
Думаю вернуться к 2.7.