删除Google Cloud Datastore中的祖先树

时间:2014-09-18 03:09:26

标签: google-cloud-datastore

如何通过Google Cloud Datastore中的API(Python协议缓冲区)删除整个祖先树?

例如,如果我在这个结构中存储了实体:祖父母/父/子,我该如何删除祖父母,这样就删除了那个&#34;节点&#34;?<的所有子孙。 / p>

如果我在祖父母的密钥上提交删除请求,祖父母实体将被删除,但其子女和子女仍然存在,并且他们的路径仍然是祖父母/父/子,即使祖父母实体已被删除。

1 个答案:

答案 0 :(得分:7)

删除父实体不会删除任何子实体。但是,您可以使用祖先查询来查找所有子实体的键,并将其作为单个事务的一部分删除。步骤将是:

  1. 开始交易。
  2. 对父实体的密钥运行keys-only kindless ancestor查询。
  3. 将#2返回的每个密钥添加到要删除的密钥列表中。
  4. 提交交易。
  5. 以下是部分代码段:

    # Create a transactional RunQueryRequest.
    req = datastore.RunQueryRequest()
    req.read_options.transaction = txn  # From previous BeginTransactionRequest.
    
    query = req.query
    
    # Add an ancestor filter.
    key_filter = query.filter.property_filter
    key_filter.property.name = '__key__'
    key_filter.operator = datastore.PropertyFilter.HAS_ANCESTOR
    path_element = key_filter.value.key_value.path_element.add()
    path_element.kind = 'ParentKind'
    path_element.name = 'parent-name'
    
    # Make it a keys-only query.
    query.projection.add().property.name = '__key__'
    
    batch = self.datastore.run_query(req)
    for entity_result in batch:
      # Add entity_result.entity.key to CommitRequest...