Python Google应用程序引擎数据存储:过滤器()
我正在尝试使用Python Google应用程序引擎数据存储:过滤器(),python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我正在尝试使用filter()方法从Google App Engine的数据存储中检索条目,如下所示: result = Sender.all().filter("email =", email).filter("source_address =", source).filter("dest_address =", dest).filter("food_type =", food_type) 然后,如果存在这样一个条目,我将更改该条目中一列的值。否则,我将显示一条错误消息 if
filter()
方法从Google App Engine的数据存储中检索条目,如下所示:
result = Sender.all().filter("email =", email).filter("source_address =", source).filter("dest_address =", dest).filter("food_type =", food_type)
然后,如果存在这样一个条目,我将更改该条目中一列的值。否则,我将显示一条错误消息
if result:
for e in result:
e.time_of_delivery = toj
e.put()
self.response.write("Time of delivery successfully rescheduled !")
else:
self.response.write("No such request.")
但是,即使根据我使用的filter()
方法施加的条件,数据存储中不存在条目,也不会显示无此类请求。
消息。相反,我得到的只是一张空白页
我的代码到底出了什么问题?为什么在数据存储中找不到条目时,即当
result=None
时,我的代码的else
部分从未执行?来自App Engine Development server的日志会说什么?您的请求看起来像是旧式数据存储请求,而不是ndb请求,因此您可能语法错误,并且代码在发送任何响应之前引发异常。:
调用以实现真值测试和内置操作bool()
;应返回False或True,或其整数等价物0或1。未定义此方法时,如果已定义,则调用\uuuu len\uuuu()
,如果结果为非零,则认为该对象为真。如果一个类既没有定义\uuuu len\uuuu()
也没有定义\uuu nonzero\uuuuu()
,那么它的所有实例都被认为是真的
gae查询
似乎既没有实现\uuuuuu非零
也没有实现\uuuuuuu len\uuuuuu
,因此更好的检查方法是:
if result.count(limit=1): # retrieves only 1 record
# results exist
else:
# results don't exist
根据前面的答案,查询对象将始终解析为true 在对查询的结果集进行计数、迭代、获取或获取之前,不会执行查询 我会做一些更像
has_result = False
for e in results:
e.time_of_delivery = toj
e.put()
self.response.write("Time of delivery successfully rescheduled !")
has_result = True
if not has_result:
self.response.write("No such request.")
这是非常低效的-调用.count()的成本与执行查询的成本基本相同。事实上,效率非常低,因为查询将被预先执行两次。除非结果集足够大,能够产生明显的影响,否则效率不是“非常”或“完全”低。虽然我们不知道结果集有多大,但我已经更新了代码以提高效率。但为什么要这么做呢。如果没有人做些什么,那就用结果来工作吧。e@TimHoffman
count()
方法比get()
或fetch()
更快,因为它不检索文档中的所有字段,只检索一个计数。随着结果集的增加,速度仍然会变慢,但这根本不是OP的问题。我认为增加limit=1
在效率方面应该已经足够了