ошибка миграции google appengine db в ndb: 'model_from_protobuf'

Я нахожусь в процессе перехода с db на ndb, и я получаю сообщение об ошибке, которое я не понимаю. Это происходит из следующей строки:

return [db.model_from_protobuf(entity_pb.EntityProto(x)) for x in data]

Полная ошибка ниже:

Файл

"/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.427741511160881878/handlers/handler.py", line 329, in dispatch
super(SiteHandler, self).dispatch()
File "/base/data/home/apps/s~proj-/44.427741511160881878/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.427741511160881878/handlers/site_handlers.py", line 112, in get
self.get_not_logged_in()
File "/base/data/home/apps/s~proj-/44.427741511160881878/handlers/site_handlers.py", line 139, in get_not_logged_in
(missions_memcache_key, missions_expiration)])
File "/base/data/home/apps/s~proj/44.427741511160881878/utils.py", line 368, in cache_get_multi
missing_items[k] = deserialize_entities(missing_items[k])
File "/base/data/home/apps/s~proj-/44.427741511160881878/utils.py", line 277, in deserialize_entities
return [db.model_from_protobuf(entity_pb.EntityProto(x)) for x in data]
AttributeError: 'module' object has no attribute 'model_from_protobuf'

Что я могу изменить, чтобы исправить это? Документация на самом деле не была столь полезной https://cloud.google.com/appengine/docs/standard/python/ndb/db_to_ndb




Ответы (1)


Ошибки, кажется, возникают из-за того, что вы все еще используете db вместо ndb в этой строке.

Согласно документацию, вы сможете декодировать из protobuf, используя ndb.LocalStructuredProperty. Я нашел еще один вопрос, где OP использует вышеупомянутый метод для чтения из protobuf.

Я также нашел публичный репозиторий где он использует pb_to_entity для преобразования, но я не совсем уверен в этом из-за отсутствия комментариев. Вы должны попробовать оба метода и посмотреть, какой из них вам больше нравится.

person Ajordat    schedule 30.06.2020
comment
извините, это моя вина, я не уточнил, что я импортировал ndb как db, чтобы ускорить миграцию - person VickTree; 30.06.2020
comment
Не могли бы вы попробовать методы, которые я приложил? - person Ajordat; 30.06.2020
comment
эй, спасибо, ndb.LocalStructureProperty, похоже, сработало. следующая ошибка, которую я получаю, это AttributeError: 'PickleProperty' object has no attribute '_db_get_value'. Как вы думаете, это связано? - person VickTree; 30.06.2020
comment
Он запускается в вашем коде или в библиотеке? Согласно исходному коду метод _db_get_value() устарел. Это несоответствие может произойти, если вы используете библиотеки с несовместимыми версиями. - person Ajordat; 30.06.2020
comment
хорошо, имеет смысл. Извините, я новичок и мне трудно понять, как решить эти проблемы. Итак, если я узнаю, что он устарел, как я увижу, что его заменяет? - person VickTree; 30.06.2020
comment
Я этого не знаю. Возможно, если вы найдете ошибку в общедоступной библиотеке, стоит открыть проблему в репозитории GitHub, и они могут решить ее или предложить вам обходной путь (или вы создадите PR, чтобы исправить это). Возможно, вы найдете решение в другом вопросе StackOverflow. - person Ajordat; 30.06.2020