>我在GAP中使用python,并尝试使用db.delete(model_obj)
删除数据存储中的一个条目。我想此操作是同步进行的,因为文档告诉了delete()
和delete_async()
之间的区别,但是当我读取数据库中的源代码时,delete 方法只是简单地调用delete_async
,这与文档所说的不匹配:(
那么在同步流中是否有任何删除?以下是 db 中的源代码:
def delete_async(models, **kwargs):
"""Asynchronous version of delete one or more Model instances.
Identical to db.delete() except returns an asynchronous object. Call
get_result() on the return value to block on the call.
"""
if isinstance(models, (basestring, Model, Key)):
models = [models]
else:
try:
models = iter(models)
except TypeError:
models = [models]
keys = [_coerce_to_key(v) for v in models]
return datastore.DeleteAsync(keys, **kwargs)
def delete(models, **kwargs):
"""Delete one or more Model instances.
"""
delete_async(models, **kwargs).get_result()
编辑:从评论中,这是原始行为异常的代码:
def tearDown(self):
print self.account
db.delete(self.device)
db.delete(self.account)
print Account.get_by_email(self.email, case_sensitive=False)
两个打印语句的结果是 <Account object at 0x10d1827d0>
<Account object at 0x10d1825d0>
。即使两个内存地址是不同的,但它们指向同一个对象。如果我在删除后放置一些延迟,例如 for 循环,则获取的对象为 None。
您为 delete
显示的代码调用delete_async
,是的,但随后它会在返回的异步句柄上调用 get_result
,这将阻塞,直到实际发生删除。因此,delete
是同步的。
您显示的示例代码返回对象的原因是您可能正在运行查询来获取帐户;我认为电子邮件不是帐户的db.Key
?不保证普通查询立即返回更新的结果。若要避免看到过时的数据,需要使用祖先查询或按键查找实体,这两者都是强一致性的。