Удаление дочернего класса полимодели в python appengine
В Python Appengine у меня есть класс полимодели (например, Animal
). Я сохранил в хранилище данных несколько экземпляров дочерних классов (например, Horse
).
Если я удалю определение Horse
класс в исходном коде Python (или изменить его имя), и получить сохраненный Horse
лица, использующие db.get
и ключ сущности, что будет?
например, найденный объект будет иметь тип Animal
? PolyModel
? Будет ли исключение?
1 ответ
Само хранилище данных на самом деле не знает / не заботится о классе python или о самой модели данных, это на самом деле просто детали реализации, специфичные для GAE db
или же ndb
клиентские библиотеки. Вы можете видеть это в примере создания объекта (который использует универсальную клиентскую библиотеку Python, без определения модели) - данные объекта представляют собой простой словарь с парами имя-значение:
task = datastore.Entity(client.key('Task'))
task.update({
'category': 'Personal',
'done': False,
'priority': 4,
'description': 'Learn Cloud Datastore'
})
Переименование / удаление модели сущностей в вашем приложении не приведет к удалению сущностей в хранилище данных, вы все равно сможете увидеть их в браузере хранилища данных.
Ключ уже созданной сущности имеет встроенный вид сущности (в виде строки). Попытка выполнить db.get()
на этом сохраненном ключе поднимет KindError
исключение, потому что он выполняет проверку данных, возвращаемых из хранилища данных, по сравнению с импортированными моделями:
Traceback (most recent call last):
File "/usr/local/google_appengine/google/appengine/tools/devappserver2/python/request_handler.py", line 226, in handle_interactive_request
exec(compiled_code, self._command_globals)
File "<string>", line 12, in <module>
File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 1540, in get
return get_async(keys, **kwargs).get_result()
File "/usr/local/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
return self.__get_result_hook(self)
File "/usr/local/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1715, in __get_hook
entities = extra_hook(entities)
File "/usr/local/google_appengine/google/appengine/api/datastore.py", line 643, in local_extra_hook
return extra_hook(result)
File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 1509, in extra_hook
cls1 = class_for_kind(entity.kind())
File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 299, in class_for_kind
raise KindError('No implementation for kind \'%s\'' % kind)
KindError: No implementation for kind 'Horse'
Поэтому, если вы хотите выполнить доработку ваших моделей и повторно использовать уже сохраненные данные, вы должны держать старые модели рядом, чтобы иметь возможность считывать данные и записывать их обратно под новые модели.