在Google App Engine中同步删除数据存储条目

时间:2013-11-14 22:17:58

标签: python google-app-engine

我在GAP中使用python并尝试使用db.delete(model_obj)删除数据存储区中的一个条目。我想这个操作是同步进行的,因为文档说明了delete()delete_async()之间的区别,但是当我读取数据库中的源代码时,删除方法只需调用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。

1 个答案:

答案 0 :(得分:1)

您为delete调用的代码delete_async,是的,然后它会在返回的异步句柄上调用get_result阻塞,直到删除实际发生。所以,delete是同步的。

您显示的示例代码返回对象的原因是您可能正在运行查询来获取帐户;我认为该电子邮件不是该帐户的db.Key?普通查询为not guaranteed to return updated results immediately。为了避免看到过时的数据,您需要使用祖先查询或按键查找实体,这两者都是非常一致的。