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

122

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

db.delete(db.Query()) Andrey Gubarev
db.delete (db.Query (keys_only = True)). Более подробная информация здесьstackoverflow.com/a/10856555/290340. Evan Plaice
Как указывает @systempuntoout ниже, GAE теперь имеетDatastore Admin это позволяет вам, помимо прочего, массово удалять объекты без какого-либо кодирования. Эта функция должна быть раскрыта здесь, а не похоронена в третьем комментарии. ralfoide
Администратор хранилища данных не работает (страница загружает iframe на несуществующий хост), поэтому нам все еще нужно использовать метод db.delete. user153275
Чтобы удалить все данные на сервере разработки, введите в командной строке следующее:/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/  где myappname - это ваш каталог, содержащий файл app.yaml для приложения. вам нужно перейти на этот путь к каталогу. credit: Steven Almeroth и Melllvar для ответа ниже gsinha

Ваш Ответ

26   ответов
0

Для 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);

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

3

Source

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

Create the Interactive Console

Во-первых, вам нужно определить интерактивную консоль 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())



Create the Mapper base class

После этого создайте этот класс 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 - это просто абстрактный класс, который позволяет перебирать каждую сущность заданного типа, будь то извлечение их данных или изменение их и сохранение обновленных сущностей обратно в хранилище данных.

Run with it!

Теперь запустите вашу интерактивную консоль 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 ()

Вот и все!

0

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

Я написал скрипт, который удаляет все не встроенные сущности. 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 = '[email protected]'
  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()
3

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

  1. Login to https://console.cloud.google.com/datastore/settings
  2. Click Open Datastore Admin. (Enable it if not enabled.)
  3. Select all Entities and press delete.(This Step run a map reduce job for deleting all selected Kinds.)

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

2

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

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

например: мое приложение "читатель" работает на порту 15080. После изменения кода и перезапуска сервера я просто запускаю & quot; dev_appserver.py --port = 15080 --clear_datastore = yes reader & quot ;.

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

58

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

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

  • connect remote server in your commandline: remote_shell_api.py yourapp /remote_api The shell will ask for your login info, and if authorized, will make a Python shell for you. You need setup url handler for /remote_api in your app.yaml

  • fetch the entities you'd like to delete, the code looks something like:

    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

Update 2013-10-28:

  • remote_shell_api.py has been replaced by remote_api_shell.py, and you should connect with remote_api_shell.py -s your_app_id.appspot.com, according to the documentation.

  • There is a new experimental feature Datastore Admin, after enabling it in app settings, you can bulk delete as well as backup your datastore through the web ui.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdevelopers.google.com/appengine/articles/remote_api
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

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

69

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

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

Не забудьте очистить ваш проект после этого.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
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
3

This is what you're looking for...

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

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

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

Below is an end-to-end REST API solution to truncating a table...

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

Here's the route:

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

Here's the handler:

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 ()), как указано в параметре action.

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

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

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

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

0
  • continuing the idea of svpino it is wisdom to reuse records marked as delete. (his idea was not to remove, but mark as "deleted" unused records). little bit of cache/memcache to handle working copy and write onl,y difference of states (before and after desired task) to datastore will make it better. for big tasks it is possible to write itermediate difference chunks to datastore to avoid data loss if memcache disappeared. to make it loss-proof it is possible to check integrity/existence of memcached results and restart task (or required part) to repeat missing computations. when data difference is written to datastore, required computations are discarded in queue.

  • other idea similar to map reduced is to shard entity kind to several different entity kinds, so it will be collected together and visible as single entity kind to final user. entries are only marked as "deleted". when "deleted" entries amount per shard overcomes some limit, "alive" entries are distributed between other shards, and this shard is closed forever and then deleted manually from dev console (guess at less cost) upd: seems no drop table at console, only delete record-by-record at regular price.

  • it is possible to delete by query by chunks large set of records without gae failing (at least works locally) with possibility to continue in next attempt when time is over:


    qdelete.getFetchPlan().setFetchSize(100);

    while (true)
    {
        long result = qdelete.deletePersistentAll(candidates);
        LOG.log(Level.INFO, String.format("deleted: %d", result));
        if (result <= 0)
            break;
    }
  • also sometimes it useful to make additional field in primary table instead of putting candidates (related records) into separate table. and yes, field may be unindexed/serialized array with little computation cost.
0

Вариант 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 секунд.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededimportError: User Rate Limit Exceeded
9

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

enter image description here

  1. First, think whether you really need to remove entries. This is expensive and it might be cheaper to not remove them.

  2. You can delete all entries by hand using the Datastore Admin.

  3. You can use the Remote API and remove entries interactively.

  4. You can remove the entries programmatically using a couple lines of code.

  5. You can remove them in bulk using Task Queues and Cursors.

  6. Or you can use Mapreduce to get something more robust and fancier.

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

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

27

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

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

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

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

@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, существуетФункция администратора хранилища данных для этой цели

Error: User Rate Limit Exceeded
26

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

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

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

Error: User Rate Limit Exceeded/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Для Python 1.3.8 включает в себя экспериментальный админ, встроенный для этого. Oнисказать: & quot; включите следующую встроенную функцию в файл app.yaml: & quot;

builtins:
- datastore_admin: on

"Datastore delete is currently available only with the Python runtime. Java applications, however, can still take advantage of this feature by creating a non-default Python application version that enables Datastore Admin in the app.yaml. Native support for Java will be included in an upcoming release."

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

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

15

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

2

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

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

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

6

Нулевой способ сделать это состоит в том, чтобы отправить 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())'}))
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

ndb.delete_multi(ndb.Query(default_options=ndb.QueryOptions(keys_only=True)))
Error: User Rate Limit ExceededSorry, unexpected error: The kind "__Stat_Kind__" is reserved.Error: User Rate Limit Exceeded
0

Я был так расстроен существующими решениями дляdeleting all data in the live datastore что я создал небольшое приложение GAE, которое может удалить довольно много данных в течение 30 секунд.

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

1

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

3

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

3

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

11

Здесь вы идете: перейдите в Datastore Admin, затем выберите тип сущности, которую вы хотите удалить, и нажмите Delete. Mapreduce позаботится об удалении!

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