【发布时间】:2020-10-09 11:28:20
【问题描述】:
我正在将 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
酷。所以我让模拟器运行并尝试让我的 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
我在 python2.7 环境中 pip 安装了 grpcio 以克服该错误。现在看起来一切都在运行。但我仍然收到缺少索引的错误。
还有一件奇怪的事情:如果我转到 http://localhost:8000 并尝试导航到与数据存储有关的任何内容,那么我会收到如下错误:
ConnectionError: Cannot connect to Cloud Datastore Emulator on ::1:{THE_PORT}
这很奇怪。
我正在考虑回到 2.7。
【问题讨论】:
标签: python google-app-engine google-cloud-datastore python-3.7 app-engine-ndb