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

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

Ответы [ 27 ]

3 голосов
/ 15 ноября 2011

Откройте «Администратор хранилища данных» для своего приложения и включите «Администратор». Тогда все ваши объекты будут перечислены с флажками. Вы можете просто выбрать нежелательные объекты и удалить их.

3 голосов
/ 01 ноября 2009

Источник

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

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

Сначала вам нужно определить интерактивную консоль appenginge. Итак, создайте файл с именем 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 голосов
/ 30 июня 2009

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

3 голосов
/ 18 января 2011

Для Python 1.3.8 включает в себя экспериментальный админ, встроенный для этого. Они говорят : "включают следующее встроенное в ваш файл app.yaml:"

builtins:
- datastore_admin: on

"Удаление хранилища данных в настоящее время доступно только во время выполнения Python. Однако приложения Java могут по-прежнему использовать эту функцию, создав версию приложения Python не по умолчанию, которая включает Datastore Admin в app.yaml. Встроенная поддержка Java будет включен в следующий выпуск. "

3 голосов
/ 31 марта 2010

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

2 голосов
/ 02 октября 2013

Добавление ответа о последних событиях.

Google недавно добавил функцию администратора хранилища данных. С помощью этой консоли вы можете создавать резервные копии, удалять или копировать свои объекты в другое приложение.

https://developers.google.com/appengine/docs/adminconsole/datastoreadmin#Deleting_Entities_in_Bulk

2 голосов
/ 12 июля 2013

Для сервера разработки вместо запуска сервера через панель запуска google app engine вы можете запустить его из терминала, например:

dev_appserver.py --port = [номер_порта] --clear_datastore = да [имя_приложения]

ex: мое приложение «reader» работает на порту 15080. После изменения кода и перезагрузки сервера я просто запускаю «dev_appserver.py --port = 15080 --clear_datastore = yes reader».

Это хорошо для меня.

2 голосов
/ 29 ноября 2009

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

1 голос
/ 14 ноября 2011

Я часто не хочу удалять все хранилище данных, поэтому я извлекаю чистую копию /war/WEB-INF/local_db.bin из системы контроля версий. Это может быть только я, но, кажется, даже при остановленном режиме разработки мне нужно физически удалить файл перед его извлечением. Это в Windows с использованием плагина Subversion для Eclipse.

0 голосов
/ 13 января 2015

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

Я написал скрипт, который удаляет все не встроенные сущности. API меняется довольно быстро, поэтому для справки я его клонировал при коммите 990ab5c7f2063e8147bcc56ee222836fd3d6e15b

from gcloud import datastore
from gcloud.datastore import SCOPE
from gcloud.datastore.connection import Connection
from gcloud.datastore import query

from oauth2client import client

def get_connection():
  client_email = 'XXXXXXXX@developer.gserviceaccount.com'
  private_key_string = open('/path/to/yourfile.p12', 'rb').read()

  svc_account_credentials = client.SignedJwtAssertionCredentials(
    service_account_name=client_email,
    private_key=private_key_string,
    scope=SCOPE)

  return Connection(credentials=svc_account_credentials)


def connect_to_dataset(dataset_id):
  connection = get_connection()
  datastore.set_default_connection(connection)
  datastore.set_default_dataset_id(dataset_id)

if __name__ == "__main__":
  connect_to_dataset(DATASET_NAME)
  gae_entity_query = query.Query()
  gae_entity_query.keys_only()
  for entity in gae_entity_query.fetch():
    if entity.kind[0] != '_':
      print entity.kind
      entity.key.delete()
...