【问题标题】:appengine migration from db to ndb: 500 error: 'PickleProperty' object has no attribute '_db_get_value'从 db 到 ndb 的 appengine 迁移:500 错误:“PickleProperty”对象没有属性“_db_get_value”
【发布时间】:2020-10-20 20:32:10
【问题描述】:

我正在为我的 appengine 网站从 db 迁移到 ndb,我收到以下错误:

500 error: 'PickleProperty' object has no attribute '_db_get_value'

完整的错误如下:

File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/base/data/home/apps/s~proj/44.427757764296494114/handlers/handler.py", line 329, in dispatch
super(SiteHandler, self).dispatch()
File "/base/data/home/apps/s~proj-/44.427757764296494114/handlers/handler.py", line 130, in dispatch
webapp2.RequestHandler.dispatch(self)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/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~proj-/44.427757764296494114/handlers/site_handlers.py", line 112, in get
self.get_not_logged_in()
File "/base/data/home/apps/s~proj-/44.427757764296494114/handlers/site_handlers.py", line 151, in get_not_logged_in
top_users = [user for user in user_query.fetch(30) if user.has_avatar()][:21]
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/utils.py", line 160, in positional_wrapper
return wrapped(*args, **kwds)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 1218, in fetch
return self.fetch_async(limit, **q_options).get_result()
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 383, in get_result
self.check_success()
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 427, in _help_tasklet_along
value = gen.throw(exc.__class__, exc, tb)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/query.py", line 995, in _run_to_list
batch = yield rpc
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 513, in _on_rpc_completion
result = rpc.get_result()
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 615, in get_result
return self.__get_result_hook(self)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/datastore/datastore_query.py", line 2971, in __query_result_hook
self.__results = self._process_results(query_result.result_list())
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/datastore/datastore_query.py", line 3004, in _process_results
for result in results]
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 194, in pb_to_query_result
return self.pb_to_entity(pb)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 691, in pb_to_entity
entity = modelclass._from_pb(pb, key=key, set_key=False)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3216, in _from_pb
_property_map[property_map_key]._deserialize(ent, p)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/174489198b39d9fb/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1473, in _deserialize
val = self._db_get_value(p.value(), p)
AttributeError: 'PickleProperty' object has no attribute '_db_get_value'

我了解到_db_get_value 已被弃用,但我用什么替换它?为什么它甚至被调用?

【问题讨论】:

    标签: python google-app-engine app-engine-ndb google-app-engine-python


    【解决方案1】:

    我建议你看看这个document,其中解释了如何在应用引擎上进行迁移,如前所述:

    “NDB 更喜欢方法而不是函数。例如,NDB 使用 key.get() 和 entity.put(),而不是 db.get(key) 和 db.put(entity)。”

    另外,请记住不再支持 python 2,您需要根据 here 中提到的迁移到 python 3。

    不再支持 Python 2 支持的 ndb 模型,如您所见 here,此外,在同一文档中您可以找到如何进行 api 的迁移 too

    我认为这种行为的根本原因是因为您的 App Engine 实例未更新并且由于此库不再受支持您正面临此问题,迁移服务文档 2 地址到数据存储模式 Client 其中您可以了解如何安装客户端库:

    pip install --upgrade google-cloud-datastore

    【讨论】:

    • 我查看了文档,但仍然很难理解该怎么做
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2023-03-16
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多