Google App Engine ndb 简单查询给出 NeedIndexError
Google App Engine ndb Simple Query gives NeedIndexError
我有一个 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: 找不到匹配的索引。
此查询的建议索引是:
- 种类:数据
属性:
- 名称:时间戳
该建议索引是用于简单查询的索引。如果我将该查询添加到 index.yaml 文件和 运行 gcloud datastore indexes create index.yaml
,我会收到此消息:
错误:(gcloud.datastore.indexes.create)服务器响应代码 [400]:
错误请求 意外的 HTTP 状态 400。
为 entity_type 创建复合索引失败:"Data"
属性 {
姓名:"timeStamp"
方向:升序
}
祖先:假
: 这个指数:
IndexDef{semantics=DATASTORE, kind=Data, indexAncestor=NONE, 属性Defs=[属性Def{path=timeStamp, mode=ORDERED, direction=ASCENDING}]}
没有必要,因为内置了单属性索引。
所以我不能 运行 这个查询,因为我需要一个索引,但我不允许创建索引。所以我的问题是,如何 运行 这个查询?
更多信息:
不确定,但这可能是相关的:当我进入 Google 云控制台 (console.cloud.google.com) 并单击数据存储选项卡时,它声称我使用 "Cloud Firestore in Native mode" 并给我一个 link 到 Firestore 选项卡。当我去那里时,我可以在 Firestore 中看到我的所有数据。即使我使用 python2 和 ndb api 访问 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.
提前致谢!
额外的信息确实是相关的。您的项目在原生模式下使用 Cloud Firestore 而不是在 Datastore 模式下使用 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 和 Cloud Datastore API,您需要在 create your database 时创建一个新项目和 select Datastore 模式的 Cloud Firestore。
如果您继续使用该项目,您应该改用 Cloud Firestore client libraries 之一。
我有一个 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: 找不到匹配的索引。
此查询的建议索引是:
- 种类:数据
属性:
- 名称:时间戳
该建议索引是用于简单查询的索引。如果我将该查询添加到 index.yaml 文件和 运行 gcloud datastore indexes create index.yaml
,我会收到此消息:
错误:(gcloud.datastore.indexes.create)服务器响应代码 [400]:
错误请求 意外的 HTTP 状态 400。
为 entity_type 创建复合索引失败:"Data"
属性 {
姓名:"timeStamp"
方向:升序
}
祖先:假
: 这个指数:
IndexDef{semantics=DATASTORE, kind=Data, indexAncestor=NONE, 属性Defs=[属性Def{path=timeStamp, mode=ORDERED, direction=ASCENDING}]}
没有必要,因为内置了单属性索引。
所以我不能 运行 这个查询,因为我需要一个索引,但我不允许创建索引。所以我的问题是,如何 运行 这个查询?
更多信息:
不确定,但这可能是相关的:当我进入 Google 云控制台 (console.cloud.google.com) 并单击数据存储选项卡时,它声称我使用 "Cloud Firestore in Native mode" 并给我一个 link 到 Firestore 选项卡。当我去那里时,我可以在 Firestore 中看到我的所有数据。即使我使用 python2 和 ndb api 访问 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.
提前致谢!
额外的信息确实是相关的。您的项目在原生模式下使用 Cloud Firestore 而不是在 Datastore 模式下使用 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 和 Cloud Datastore API,您需要在 create your database 时创建一个新项目和 select Datastore 模式的 Cloud Firestore。
如果您继续使用该项目,您应该改用 Cloud Firestore client libraries 之一。