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

Хорошо, если ты не знаешь. Но вы уволены, если не можете даже погуглить.

Интернет - это инструмент. Это не делает тебя глупее, если ты учишься у него.

122
задан Dan McGrath 17 August 2016 в 17:35
поделиться

7 ответов

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

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

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

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

69
ответ дан 24 November 2019 в 01:23
поделиться

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

3
ответ дан 24 November 2019 в 01:23
поделиться

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

15
ответ дан 24 November 2019 в 01:23
поделиться

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

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

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

  • выберите объекты, которые вы хотите удалить, код выглядит примерно так:

  from models import Entry
 query = Entry.all (keys_only = True)
 записи = query.fetch (1000)
 db.delete (записи)
\ # Это может массово удалить 1000 объектов за раз

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

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

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

58
ответ дан 24 November 2019 в 01:23
поделиться

Источник

Я получил это из http://code.google.com/appengine/articles/remote_api.html .

Создание интерактивной консоли

Во-первых, вам необходимо определить интерактивную консоль приложения. Итак, создайте файл с именем appengine_console.py и введите следующее:

#!/usr/bin/python
import code
import getpass
import sys

# These are for my OSX installation. Change it to match your google_appengine paths. sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine")
sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/yaml/lib")

from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.ext import db

def auth_func():
  return raw_input('Username:'), getpass.getpass('Password:')

if len(sys.argv) < 2:
  print "Usage: %s app_id [host]" % (sys.argv[0],)
app_id = sys.argv[1]
if len(sys.argv) > 2:
  host = sys.argv[2]
else:
  host = '%s.appspot.com' % app_id

remote_api_stub.ConfigureRemoteDatastore(app_id, '/remote_api', auth_func, host)

code.interact('App Engine interactive console for %s' % (app_id,), None, locals())



Создайте базовый класс Mapper

Когда он будет на месте, создайте этот класс Mapper. Я только что создал новый файл с именем utils.py и бросил следующее:

class Mapper(object):
  # Subclasses should replace this with a model class (eg, model.Person).
  KIND = None

  # Subclasses can replace this with a list of (property, value) tuples to filter by.
  FILTERS = []

  def map(self, entity):
    """Updates a single entity.

    Implementers should return a tuple containing two iterables (to_update, to_delete).
    """
    return ([], [])

  def get_query(self):
    """Returns a query over the specified kind, with any appropriate filters applied."""
    q = self.KIND.all()
    for prop, value in self.FILTERS:
      q.filter("%s =" % prop, value)
    q.order("__key__")
    return q

  def run(self, batch_size=100):
    """Executes the map procedure over all matching entities."""
    q = self.get_query()
    entities = q.fetch(batch_size)
    while entities:
      to_put = []
      to_delete = []
      for entity in entities:
        map_updates, map_deletes = self.map(entity)
        to_put.extend(map_updates)
        to_delete.extend(map_deletes)
      if to_put:
        db.put(to_put)
      if to_delete:
        db.delete(to_delete)
      q = self.get_query()
      q.filter("__key__ >", entities[-1].key())
      entities = q.fetch(batch_size)

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

Запустите его!

Теперь запустите интерактивную консоль appengine:

$python appengine_console.py <app_id_here>

Это должно запустить интерактивную консоль. В нем создайте подкласс Model:

from utils import Mapper
# import your model class here 
class MyModelDeleter(Mapper):
    KIND = <model_name_here>

    def map(self, entity):
        return ([], [entity])

И, наконец, запустите его (из интерактивной консоли): mapper = MyModelDeleter () mapper.run ()

Вот и все!

3
ответ дан 24 November 2019 в 01:23
поделиться

Если у вас много данных, использование веб-интерфейса может занять много времени. Утилита App Engine Launcher позволяет удалить все за один раз с помощью флажка «Очистить хранилище данных при запуске». Эта утилита теперь доступна как для Windows, так и для Mac (платформа Python).

2
ответ дан 24 November 2019 в 01:23
поделиться

Я создал панель дополнений, которую можно использовать с вашими развернутыми приложениями App Engine. В ней в выпадающем списке перечислены виды, которые присутствуют в хранилище данных, и вы можете нажать кнопку, чтобы запланировать "задания", которые удаляют все сущности определенного вида или просто все. Вы можете скачать его здесь:
http://code.google.com/p/jobfeed/wiki/Nuke

3
ответ дан 24 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: