Есть ли способ удалить все сущности из пространства имен хранилища данных, используя Python3 (БЕЗ потока данных)? - PullRequest
0 голосов
/ 19 февраля 2019

Необходимо стереть пространство имен хранилища данных перед загрузкой тестовых данных во время тестирования.Использование API Cloud Datastore с Python3.

Я использую Datastore с App Engine в Python3.Для целей тестирования я написал скрипт, использующий API Cloud Datastore API для загрузки нескольких объектов разных типов в хранилище данных.Поскольку это небольшой проект, на данный момент существует только 4 вида и только 2-3 объекта на вид.

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

На данный момент единственными решениями, которые я могу найти, является использование Dataflow (для этого совершенно избыточно)Я считаю), или удалить каждую сущность в отдельности, используя ее ключ.Я бы предпочел просто стереть все пространство имен, если это возможно.

Если у кого-нибудь есть какие-либо советы или предложения о том, как это сделать, пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы должны иметь возможность использовать тот же API Cloud Datastore API, что и ваше приложение, которое можно использовать даже вне облака Google (см. Как использовать хранилище данных Google для моего веб-приложения, котороеНЕ размещается в Google App Engine? ).Этот ответ основан только на документах, я на самом деле не пробовал.

Вам нужно сделать что-то вроде этого:

  1. найти все виды в вашемхранилище данных приложения (может быть, просто в интересующем пространстве имен?).Это возможно, используя хранилище данных метаданные , в частности Запросы типа :

    query = client.query(kind='__kind__')
    query.keys_only()
    
    kinds = [entity.key.id_or_name for entity in query.fetch()]
    
  2. найти ключи для сущностей каждого вида,используйте обычные запросы только для ключей, как вы теперь знаете, вид.Ограничьте эти запросы интересующим пространством имен.Удалите объекты по ключам в пакетном режиме для большей эффективности:

    for kind in kinds:
        query = client.query(kind=kind, namespace=NAMESPACE)
        query.keys_only()
        keys = query.fetch()
        client.delete_multi(keys)
    
0 голосов
/ 20 февраля 2019

Вы можете написать скрипт на python, чтобы удалить все виды в определенном пространстве имен.Предполагая, что вы заранее знаете названия видов.

from google.appengine.ext import ndb
from google.appengine.api import namespace_manager

namespace = "PROVIDE_NAMESPACE_HERE"
kind_list = [kind_1,kind_2,kind_3,kind_4]

namespace_manager.set_namespace(namespace) # will set to the namespace provided

for a_kind in kind_list:
    # will fetch keys of all objects in that kind
    kind_keys = a_kind.gql("").fetch(keys_only = True) 
    # will delete all the keys at once
    ndb.delete_multi(kind_keys) 

После удаления всех видов из определенного пространства имен ваше пространство имен будет видимо в течение примерно 24 часов в облачном хранилище данных, и если после этого оно не будет содержать никакихВид, он будет автоматически удален.

Надеюсь, что это ответ на ваш вопрос !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...