App Engine Python ndb map_async删除的奇怪行为

时间:2014-07-25 09:49:59

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

我正在使用map_async(通过remote_api)使用一个非常简单的回调tasklet,它只删除传递的密钥。但是,所有实体都是始终在第一次删除。在大多数情况下,我必须多次运行查询以删除所有实体。代码:

@ndb.tasklet
def delete_key_tasklet(key):
    yield key.delete_async()

class Person(ndb.Model):
    name1 = ndb.StringProperty()
    name2 = ndb.StringProperty()

    @classmethod
    def delete_persons_async(cls, ancestor_key, name):
        q = cls.query(ancestor=ancestor_key)
        q = q.filter(ndb.OR(cls.name1 == name, cls.name2 == name))
        return q.map_async(delete_key_tasklet, keys_only=True)

例如,如果我使用以下查询:

Person.delete_persons_async(ancestor_key, 'David').get_result()

我希望删除名称为“David”的所有Person个实体。

  • 可能是最终一致性的问题。我已经等了好几分钟,并且几次刷新了memcache,看看这些实体是否最终消失了。
  • 如果我将tasklet更改为yield key.get_async(),它会正确获取所有实体。

所以:

  1. 关于发生了什么的任何想法?
  2. 是remote_api的一个(删除)限制吗?

1 个答案:

答案 0 :(得分:1)

您需要在@ndb.toplevel中包装整个操作,或者在delete_async返回值的结果上显式调用ndb.Future.get_result,以确保操作完成。

  

如果请求处理程序退出太早,则put可能永远不会发生