2014-09-18 3 views
2

Google Cloud Datastore에서 API (Python 프로토콜 버퍼)를 통해 전체 조상 트리를 삭제하려면 어떻게해야하나요?Google Cloud Datastore에서 상위 트리 삭제

예를 들어, 조부모/부모/자식과 같은 구조체에 엔티티가 저장되어있는 경우 어떻게하면 할아버지를 삭제할 수 있습니까? 그렇게하면 "노드"의 모든 자식과 손자를 삭제할 수 있습니까?

조부모 엔티티가 삭제 되었더라도 조부모의 키에 대한 삭제 요청을 제출하면 조부모 엔티티는 삭제되지만 자식과 손자는 그대로 유지되며 경로는 여전히 조부모/부모/자식입니다.

답변

7

상위 엔티티를 삭제해도 하위 엔티티는 삭제되지 않습니다. 그러나 상위 쿼리를 사용하여 모든 하위 엔터티의 키를 찾고 단일 트랜잭션의 일부로 삭제할 수 있습니다. 단계는 다음과 같습니다.

  1. 트랜잭션을 시작하십시오.
  2. 부모 엔터티의 키에 대해 keys-onlykindless ancestor 쿼리를 실행하십시오.
  3. # 2가 반환 한 각 키를 삭제할 키 목록에 추가하십시오.
  4. 트랜잭션을 커밋하십시오.

    # 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... 
    
    : 여기

은 부분 코드입니다

관련 문제