gpt4 book ai didi

python - ndb.get_multi 返回 AssertionError

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:16 28 4
gpt4 key购买 nike

在过去 48 小时左右,我的小型 python GAE 应用程序开始从 ndb.get_multi 调用中获取 AssertionErrors。

追加了完整的回溯,生产服务器上的 _BaseValue 的 __init__ 在/base/data/.../ndb/model.py 的第 734 行生成了错误,失败的断言是 b_val is not None with消息“不能包装无”

该错误似乎与一个或多个特定实体无关,但到目前为止我只看到它与一种实体类型相关(尚未测试其他实体类型)。

get_multi 调用最多只有十几个键,错误是间歇性的,因此重复有时会成功。或者不是...

我没有通过远程 shell 看到此错误,但我注意到我的本地安装是 1.9.23,而日志条目显示生产服务器是 1.9.25(GoogleAppEngineLauncher 说我的本地安装是最新的)

我正在添加一个解决方法来捕获异常并遍历键以单独获取它们,但我仍然在 context.py 的第 744 行看到关于“suspended generator get”的上游警告。

对于至少 2 个不同的键列表(以及在 AssertionError 之前),第一次从列表中获取此实体类型时会出现警告。

我不想以这种方式包装所有 get_multi 调用。

这是怎么回事?


回溯:

Cannot wrap None
Traceback (most recent call last):
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~thegapnetball/115.386356111937586421/handlers/assess.py", line 50, in get
rs = ndb.get_multi(t.players)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3905, in get_multi
for future in get_multi_async(keys, **ctx_options)]
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 326, in get_result
self.check_success()
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 372, in _help_tasklet_along
value = gen.send(val)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/context.py", line 751, in get
pbs = entity._to_pb(set_key=False).SerializePartialToString()
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3147, in _to_pb
prop._serialize(self, pb, projection=self._projection)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 2379, in _serialize
projection=projection)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1405, in _serialize
values = self._get_base_value_unwrapped_as_list(entity)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1175, in _get_base_value_unwrapped_as_list
wrapped = self._get_base_value(entity)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1163, in _get_base_value
return self._apply_to_values(entity, self._opt_call_to_base_type)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1335, in _apply_to_values
value[:] = map(function, value)
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1217, in _opt_call_to_base_type
value = _BaseValue(self._call_to_base_type(value))
File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 734, in \__init__
assert b_val is not None, "Cannot wrap None"
AssertionError: Cannot wrap None

最佳答案

Tim Hoffman 和 Patrick Costello 让我走上了解决这个问题的正确轨道。

我增加了版本以保护一些更改,但完成时间比我预期的要长。

一项更改将重复的 StructuredProperty 添加到从 ndb.Model 派生的模型中,并且我放置了几个具有额外属性的实体(总共 1100 个中大约有 30 个)。

没有额外属性的先前版本仍然是默认版本并且很少被使用,因此实体变得不一致足以产生间歇性的 AssertionError。

主要的教训是注意 Google 架构更新文章中的建议,特别是将底层父级更改为 Expando 和/或禁用数据存储编辑,直到任何迁移完成。

https://cloud.google.com/appengine/articles/update_schema

解决方法是将属性添加到以前的版本,获取所有实体然后将它们放入。

感谢 Tim 和 Patrick 的指点!

关于python - ndb.get_multi 返回 AssertionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32108385/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com