Удаление объектов из движка приложения - PullRequest
4 голосов
/ 09 февраля 2011

Я собираюсь удалить записи с моего сервера приложений Python следующим образом:

    try:
        while True:
            q = db.GqlQuery("SELECT __key__ FROM SampleData")
            assert q.count()
            db.delete(q.fetch(400))
            time.sleep(0.2)
        except Exception, e:
        self.response.out.write(repr(e)+'\n')
        pass

        try:
        while True:
            q = db.GqlQuery("SELECT __key__ FROM UserData")
            assert q.count()
            db.delete(q.fetch(400))
            time.sleep(0.2)
        except Exception, e:
        self.response.out.write(repr(e)+'\n')
        pass

.. но это только кажется уродливым, и я продолжаю подозревать, что это не совсем надежно. Есть ли способ сделать это лучше, чтобы удалить записи некоторого числа типов вместо создания одного из этих циклов while?

Обновление: у меня есть одно ограничение: я периодически запускаю его с помощью задания cron, поэтому не хочу делать это вручную (например, через консоль администратора).

Ответы [ 3 ]

4 голосов
/ 09 февраля 2011

Вы можете использовать вкладку администратора хранилища данных консоли администратора, чтобы удалить все объекты, смотрите здесь:

http://code.google.com/appengine/docs/adminconsole/datastoreadmin.html#Deleting_Entities_in_Bulk

3 голосов
/ 09 февраля 2011

Несколько улучшений:

  1. Вам не нужно спать после каждой партии
  2. Вам следует использовать очередь задач и быть готовыми связать другую задачу, если вы не закончите к тому времени, когда наступит крайний срок.
  3. Вы должны использовать курсоры. Если вы этого не сделаете, последующие запросы должны пропустить все «захороненные» строки, которые вы уже удалили, чтобы добраться до все еще существующих строк.

Если вы удаляете большинство или все виды, вы можете вместо этого использовать библиотеку mapreduce.

0 голосов
/ 09 февраля 2011

Если вы хотите удалить много данных, вы можете использовать библиотеку deferred , предоставленную Google, - чтобы задание cron запускало отложенную задачу, которая может удалять ваши объекты в пакетном режиме:

class DeleteMapper(mapper.Mapper):
    KIND = MyKindOfObject

    # Delete all objects of type MyKindOfObject.
    def map(self, key):
        todelete = [key]
        return ([], todelete)

Вероятно, вы можете сделать то же самое с более новой библиотекой mapreduce , однако у меня нет примера для вас.

...