Как удалить все хранилище данных в Google App Engine? - PullRequest
122 голосов
/ 30 июня 2009

Кто-нибудь знает, как удалить все хранилище данных в Google App Engine ?

Ответы [ 27 ]

0 голосов
/ 20 мая 2014

Если вы используете ndb, метод, который работал для меня для очистки хранилища данных:

ndb.delete_multi(ndb.Query(default_options=ndb.QueryOptions(keys_only=True)))
0 голосов
/ 18 февраля 2016

Для всех людей, которым нужно быстрое решение для сервера разработки (на момент написания в феврале 2016 г.):

  1. Остановите сервер разработки.
  2. Удалить каталог target .
  3. Перестройте проект.

Это сотрет все данные из хранилища данных.

0 голосов
/ 10 сентября 2010

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

Как установить и т. Д .: https://github.com/xamde/xydra

0 голосов
/ 28 мая 2015
  • Продолжая идею svpino, целесообразно повторно использовать записи, помеченные как delete. (его идея заключалась не в удалении, а в пометке «удаленных» неиспользуемых записей). немного кеша / memcache для обработки рабочей копии и записи только разницы состояний (до и после желаемой задачи) в хранилище данных сделает это лучше. для больших задач можно записать куски промежуточных различий в хранилище данных, чтобы избежать потери данных в случае исчезновения memcache. чтобы сделать его защищенным от потерь, можно проверить целостность / существование результатов memcached и перезапустить задачу (или необходимую часть), чтобы повторить пропущенные вычисления. когда разница данных записывается в хранилище данных, необходимые вычисления отбрасываются в очередь.

  • Другая идея, аналогичная сокращенной карте, заключается в разделении вида сущности на несколько разных типов сущностей, поэтому она будет собрана вместе и видима как единая сущность для конечного пользователя. Записи помечаются только как «удаленные». когда количество «удаленных» записей на один шард превышает некоторый лимит, «живые» записи распределяются между другими шардами, и этот шард закрывается навсегда, а затем удаляется вручную из консоли разработчика (предположим, с меньшими затратами) на консоли, только удаляйте запись за записью по обычной цене.

  • возможно удалить по запросу кусками большой набор записей без сбоя (по крайней мере, локально) с возможностью продолжения при следующей попытке по истечении времени:


    qdelete.getFetchPlan().setFetchSize(100);

    while (true)
    {
        long result = qdelete.deletePersistentAll(candidates);
        LOG.log(Level.INFO, String.format("deleted: %d", result));
        if (result <= 0)
            break;
    }
  • также иногда полезно сделать дополнительное поле в первичной таблице вместо помещения кандидатов (связанных записей) в отдельную таблицу. и да, поле может быть неиндексированным / сериализованным массивом с небольшими вычислительными затратами.
0 голосов
/ 09 февраля 2011

PHP вариация:

import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.DatastoreServiceFactory;

define('DATASTORE_SERVICE', DatastoreServiceFactory::getDatastoreService());

function get_all($kind) {
    $query = new Query($kind);
    $prepared = DATASTORE_SERVICE->prepare($query);
    return $prepared->asIterable();
}

function delete_all($kind, $amount = 0) {
    if ($entities = get_all($kind)) {
        $r = $t = 0;
        $delete = array();
        foreach ($entities as $entity) {
            if ($r < 500) {
                $delete[] = $entity->getKey();
            } else {
                DATASTORE_SERVICE->delete($delete);
                $delete = array();
                $r = -1;
            }
            $r++; $t++;
            if ($amount && $amount < $t) break;
        }
        if ($delete) {
            DATASTORE_SERVICE->delete($delete);
        }
    }
}

Да, это займет время и 30 секунд. это предел. Я собираюсь поставить пример приложения ajax для автоматизации за 30 секунд.

0 голосов
/ 29 февраля 2016

для Java

DatastoreService db = DatastoreServiceFactory.getDatastoreService();
List<Key> keys = new ArrayList<Key>();
for(Entity e : db.prepare(new Query().setKeysOnly()).asIterable())
    keys.add(e.getKey());
db.delete(keys);

Хорошо работает на сервере разработки

0 голосов
/ 14 сентября 2011
for amodel in db.Model.__subclasses__():
                dela=[]
                print amodel
                try:
                    m = amodel()
                    mq = m.all()
                    print mq.count()
                    for mw in mq:
                        dela.append(mw)
                    db.delete(dela)
            #~ print len(dela)

                except:
                    pass
...