2014-09-18 3 views
2

Как удалить все дерево предков через API (буфер протокола Python) в хранилище данных Google Cloud?Удалить дерево предков в облачном хранилище Google

Например, если у меня есть сущности, хранящиеся в этой структуре: grandparent/parent/child, как я могу удалить grandparent и тем самым удалить всех детей и внуков этого «узла»?

Если я отправляю запрос на удаление по ключу дедушки и бабушки, объект дедушки и бабушки удаляется, но его дети и внуки остаются, а их путь по-прежнему остается дедушкой/родителем/ребенком, хотя сущность бабушки и дедушки была удалена.

ответ

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... 
Смежные вопросы