在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
?会有例外吗?
答案 0 :(得分:2)
数据存储本身并不真正了解/关心python类或数据模型本身,这些实际上只是GAE db
或ndb
客户端库的特定实现细节。您可以在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'
因此,如果您想要对模型进行返工并重新使用已存储的数据,则应保留旧模型,以便能够读取数据并在新模型下将其写回。