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

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

Ответы [ 27 ]

69 голосов
/ 30 июня 2009

Если вы говорите о живом хранилище данных , откройте панель управления для вашего приложения (войдите в appengine), затем datastore -> dataviewer, выберите все строки таблицы, которую вы хотите удалить, и нажмите кнопка удаления (вам придется сделать это для всех ваших таблиц). Вы можете сделать то же самое программно через remote_api (но я никогда не использовал его).

Если вы говорите о хранилище данных разработки , вам просто нужно удалить следующий файл: "./ WEB-INF / appengine-генерируемый / local_db.bin ". Файл будет сгенерирован для вас снова при следующем запуске сервера разработки, и вы получите чистую базу данных.

После этого обязательно очистите ваш проект.

Это одна из маленьких ошибок, которая пригодится вам, когда вы начнете играть с Google Application Engine. Вы обнаружите, что сохраняете объекты в хранилище данных, а затем изменяете объектную модель JDO для своих персистентных объектов, заканчивая устаревшими данными, которые повсеместно приводят к сбою приложения.

58 голосов
/ 04 сентября 2009

Лучший подход - это метод удаленного API, предложенный Ником, он App Engine инженер из Google , так что доверяйте ему.

Это не так сложно сделать, и последний 1.2.5 SDK предоставляет remote_shell_api.py с полки. Итак, перейдите к загрузке нового SDK. Затем выполните шаги:

  • подключить удаленный сервер в командной строке: remote_shell_api.py yourapp /remote_api Оболочка запросит вашу регистрационную информацию и, если авторизоваться, сделает для вас оболочку Python. Вам нужно установить обработчик URL для / remote_api в вашем app.yaml

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

    from models import Entry
    query = Entry.all(keys_only=True)
    entries =query.fetch(1000)
    db.delete(entries)
    \# This could bulk delete 1000 entities a time

Обновление 2013-10-28 :

  • remote_shell_api.py был заменен на remote_api_shell.py, и вы должны соединиться с remote_api_shell.py -s your_app_id.appspot.com, в соответствии с документацией .

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

27 голосов
/ 01 сентября 2010

Самый быстрый и эффективный способ обработки массового удаления в Datastore - использование нового mapper API , анонсированного в последней Google I / O .

Если ваш язык выбора Python , вам просто нужно зарегистрировать свой картограф в файле mapreduce.yaml и определить функцию, подобную этой:

from mapreduce import operation as op
def process(entity):
 yield op.db.Delete(entity)

На Java вы должны взглянуть на эту статью , которая предлагает такую ​​функцию:

@Override
public void map(Key key, Entity value, Context context) {
    log.info("Adding key to deletion pool: " + key);
    DatastoreMutationPool mutationPool = this.getAppEngineContext(context)
            .getMutationPool();
    mutationPool.delete(value.getKey());
}

EDIT:
Начиная с SDK 1.3.8, для этой цели имеется функция администратора хранилища данных

26 голосов
/ 03 сентября 2010

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

/path/to/dev_appserver.py --clear_datastore=yes myapp

Вы также можете сократить --clear_datastore с помощью -c.

15 голосов
/ 30 июня 2009

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

11 голосов
/ 09 декабря 2011

Итак, перейдите в «Администратор хранилища данных», затем выберите тип сущности, которую хотите удалить, и нажмите «Удалить». Mapreduce позаботится об удалении!

9 голосов
/ 28 марта 2015

Существует несколько способов удаления записей из хранилища данных App Engine:

enter image description here

  1. Сначала подумайте, действительно ли вам нужно удалять записи. Это дорого и может быть дешевле не удалять их.

  2. Вы можете удалить все записи вручную, используя Администратор хранилища данных.

  3. Вы можете использовать Remote API и удалять записи в интерактивном режиме.

  4. Вы можете удалить записи программно, используя пару строк кода.

  5. Вы можете массово удалить их, используя очереди задач и курсоры.

  6. Или вы можете использовать Mapreduce, чтобы получить что-то более надежное и изящное.

Каждый из этих методов описан в следующем сообщении в блоге: http://www.shiftedup.com/2015/03/28/how-to-bulk-delete-entries-in-app-engine-datastore

Надеюсь, это поможет!

6 голосов
/ 24 января 2011

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

import urllib
import urllib2

urllib2.urlopen('http://localhost:8080/_ah/admin/interactive/execute',
    data = urllib.urlencode({'code' : 'from google.appengine.ext import db\n' +
                                      'db.delete(db.Query())'}))
3 голосов
/ 01 июня 2012

Это то, что вы ищете ...

db.delete(Entry.all(keys_only=True))

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

Вот ссылка на ответ от Ника Джонсона, описывающая его далее.

Ниже представлено комплексное решение REST API для усечения таблицы ...

Я настроил REST API для обработки транзакций базы данных, где маршруты напрямую отображаются на соответствующую модель / действие. Это можно вызвать, введя правильный URL (example.com/inventory/truncate) и войдя в систему.

Вот маршрут:

Route('/inventory/truncate', DataHandler, defaults={'_model':'Inventory', '_action':'truncate'})

Вот обработчик:

class DataHandler(webapp2.RequestHandler):
  @basic_auth
  def delete(self, **defaults):
    model = defaults.get('_model')
    action = defaults.get('_action')
    module = __import__('api.models', fromlist=[model])
    model_instance = getattr(module, model)()
    result = getattr(model_instance, action)()

Он начинается с динамической загрузки модели (т. Е. Инвентаря, найденного в api.models), затем вызывает правильный метод (Inventory.truncate ()), как указано в параметре действия.

@basic_auth - это декоратор / оболочка, которая обеспечивает аутентификацию для чувствительных операций (например, POST / DELETE). Также имеется oAuth-декоратор , если вы беспокоитесь о безопасности.

Наконец, действие называется:

def truncate(self):
  db.delete(Inventory.all(keys_only=True))

Это похоже на магию, но на самом деле это очень просто. Самое приятное, что delete () можно использовать повторно для удаления одного или нескольких результатов, добавив в модель еще одно действие.

3 голосов
/ 31 января 2015

Вы можете удалить все хранилище данных, удалив все виды одного за другим. с приборной панелью Google Appengine. Пожалуйста, следуйте этим шагам.

  1. Войдите на сайт https://console.cloud.google.com/datastore/settings
  2. Нажмите Откройте Администратор хранилища данных . (Включите его, если он не включен.)
  3. Выберите все объекты и нажмите «Удалить». (На этом шаге выполняется сокращение карты для удаления всех выбранных видов.)

для получения дополнительной информации см. Это изображение http://storage.googleapis.com/bnifsc/Screenshot%20from%202015-01-31%2023%3A58%3A41.png

...