在python appengine中删除子类的multiodel

时间:2017-09-21 20:12:14

标签: python google-app-engine google-cloud-datastore polymodel

在python appengine中,我有一个多模型类(例如$ memused() { pmap "$1" | tail -1; } $ memused $$; time for ((i=1; i<=10000000; i++)); do :; done; memused $$ total 23208K real 0m27.556s user 0m27.604s sys 0m0.028s total 23208K $ memused $$; time for i in {1..10000000}; do :; done; memused $$ total 23208K real 0m17.221s user 0m16.788s sys 0m0.480s total 1898112K )。我在数据存储区中存储了一些子类的实例(例如Animal)。

如果我删除python源代码中Horse类的定义(或更改其名称),并使用Horse和实体键获取存储的Horse实体,会发生什么?

e.g。检索到的实体是否为db.get类型? Animal?会有例外吗?

1 个答案:

答案 0 :(得分:2)

数据存储本身并不真正了解/关心python类或数据模型本身,这些实际上只是GAE dbndb客户端库的特定实现细节。您可以在Creating an entity示例(使用通用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'

因此,如果您想要对模型进行返工并重新使用已存储的数据,则应保留旧模型,以便能够读取数据并在新模型下将其写回。