Кто-нибудь знает, как удалить все datastore в Google App Engine?
Как удалить все хранилища данных в Google App Engine?
Ответ 1
Если вы говорите о live datastore, откройте панель инструментов для своего приложения (войдите в приложение appengine), затем datastore → dataviewer, выберите все строки для таблицы, которую вы хотите удалить, и нажмите кнопку удаления (вам нужно будет сделать это для всех ваших таблиц). Вы можете сделать то же самое программно через remote_api (но я никогда не использовал его).
Если вы говорите о хранилище данных разработки, вам просто нужно удалить следующий файл: "./WEB-INF/AppEngine сгенерированных /local _db.bin" . Файл будет сгенерирован для вас снова при следующем запуске сервера разработки, и вы получите четкий db.
После этого обязательно очистите проект.
Это одна из маленьких ошибок, которые пригодится, когда вы начинаете играть с Google Application Engine. Вы обнаружите, что сохраняете объекты в хранилище данных, а затем изменяете объектную модель JDO для своих устойчивых объектов, заканчивая устаревшими данными, которые могут повредить ваше приложение повсюду.
Ответ 2
Лучший подход - это метод удаленного API, предложенный Ником, он Engine 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
, в соответствии с документации. -
Существует новая экспериментальная функция Datastore Admin, после включения в настройках приложения вы может массовое удаление, а также резервное копирование вашего хранилища данных через веб-интерфейс.
Ответ 3
Самый быстрый и эффективный способ обработки массового удаления в Datastore - это использовать новый 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, для этой цели функция Datastore admin
Ответ 4
Вы можете очистить хранилище данных сервера разработки при запуске сервера:
/path/to/dev_appserver.py --clear_datastore=yes myapp
Вы также можете сокращать --clear_datastore
с помощью -c
.
Ответ 5
Если у вас есть значительный объем данных, вам нужно использовать script, чтобы удалить его. Однако вы можете использовать remote_api, чтобы очистить хранилище данных с клиентской стороны простым способом.
Ответ 6
Здесь вы идете: перейдите в Datastore Admin, а затем выберите тип Entity, который хотите удалить, и нажмите "Удалить". Mapreduce позаботится об удалении!
Ответ 7
Существует несколько способов удалить записи из хранилища данных App Engine:
-
Сначала подумайте, действительно ли вам нужно удалить записи. Это дорого, и было бы дешевле не удалять их.
-
Вы можете удалить все записи вручную, используя Datastore Admin.
-
Вы можете использовать Remote API и интерактивно удалять записи.
-
Вы можете программно удалить эти записи, используя пару строк кода.
-
Вы можете удалить их навалом, используя очереди задач и курсоры.
-
Или вы можете использовать Mapreduce, чтобы получить что-то более надежное и привлекательное.
Каждый из этих методов объясняется в следующем сообщении в блоге: http://www.shiftedup.com/2015/03/28/how-to-bulk-delete-entries-in-app-engine-datastore
Надеюсь, что это поможет!
Ответ 8
Нуль-setup способ сделать это состоит в том, чтобы отправить 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())'}))
Ответ 9
Вы можете сделать это, используя веб-интерфейс. Войдите в свою учетную запись, перейдите по ссылкам слева. В управлении хранилища данных у вас есть опции для изменения и удаления данных. Используйте соответствующие параметры.
Ответ 10
Источник
Я получил это от 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()
Что это!
Ответ 11
Я создал панель надстройки, которая может использоваться с вашими приложениями App Engine. В нем перечислены типы, которые присутствуют в хранилище данных в раскрывающемся списке, и вы можете нажать кнопку, чтобы запланировать "задачи", которые удаляют все объекты определенного типа или просто все. Вы можете скачать его здесь:
http://code.google.com/p/jobfeed/wiki/Nuke
Ответ 12
Для Python 1.3.8 включает в себя экспериментальный админ-встроенный для этого. Они say: "включить следующий встроенный файл app.yaml:"
builtins:
- datastore_admin: on
"Datastore удалить в настоящее время доступна только со средой выполнения Python. Java приложения, однако, все еще могут воспользоваться этой функцией, создав версию приложения Python не по умолчанию, который позволяет Датастор Администратор в app.yaml. Встроенная поддержка Java будут включены в предстоящий выпуск".
Ответ 13
Откройте "Администратор хранилища данных" для своего приложения и включите Admin. Тогда все ваши сущности будут перечислены с флажками. Вы можете просто выбрать нежелательные темы и удалить их.
Ответ 14
Это то, что вы ищете...
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)()
Он начинается с загрузки динамической модели (т.е. Inventory, найденной под api.models), затем вызывает правильный метод (Inventory.truncate()), как указано в параметре действия.
@basic_auth - это декоратор/обертка, которая обеспечивает аутентификацию для чувствительных операций (то есть POST/DELETE). Там также есть oAuth decorator, если вы обеспокоены безопасностью.
Наконец, действие вызывается:
def truncate(self):
db.delete(Inventory.all(keys_only=True))
Похоже на магию, но на самом деле это очень просто. Лучшая часть, delete() может быть повторно использована для обработки удаленных результатов один или несколько, добавив еще одно действие в модель.
Ответ 15
Если у вас много данных, использование веб-интерфейса может занять много времени. Утилита App Engine Launcher позволяет вам удалять все за один раз с помощью флажка "Очистить хранилище при запуске". Эта утилита теперь доступна как для Windows, так и для Mac (инфраструктура Python).
Ответ 16
Для сервера разработки вместо запуска сервера с помощью запуска программы google-приложений вы можете запустить его с терминала, например:
dev_appserver.py --port = [portnumber] --clear_datastore = yes [nameofapplication]
ex: мое приложение "reader" работает на порту 15080. После изменения кода и перезапуска сервера я просто запустил "dev_appserver.py --port = 15080 --clear_datastore = yes reader".
Это хорошо для меня.
Ответ 17
Добавление ответа о последних событиях.
Недавно Google добавила функцию администратора хранилища данных. Вы можете копировать, удалять или копировать свои объекты в другое приложение с помощью этой консоли.
https://developers.google.com/appengine/docs/adminconsole/datastoreadmin#Deleting_Entities_in_Bulk
Ответ 18
Вы можете удалить все хранилища данных, удалив все виды по одному. с панелью объявлений Google appengine. Следуйте этим шагам.
- Войдите в https://console.cloud.google.com/datastore/settings
- Нажмите Открыть Datastore Admin. (Включите его, если он не включен.)
- Выберите все объекты и нажмите "Удалить" (этот шаг запустит работу по сокращению карты для удаления всех выбранных видов.)
для получения дополнительной информации см. это изображение http://storage.googleapis.com/bnifsc/Screenshot%20from%202015-01-31%2023%3A58%3A41.png
Ответ 19
Я часто не хочу удалять все хранилище данных, поэтому я извлекаю чистую копию /war/WEB -INF/local_db.bin из исходного элемента управления. Это может быть только я, но кажется, что даже с отключением режима Dev я должен физически удалить файл, прежде чем потянуть его. Это в Windows, используя плагин subversion для Eclipse.
Ответ 20
Я был настолько расстроен из-за существующих решений для удаления всех данных в реальном хранилище данных, что я создал небольшое приложение GAE, которое может удалить довольно много данных за 30 секунд.
Как установить и т.д. https://github.com/xamde/xydra
Ответ 21
Изменение 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 секунд.
Ответ 22
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
Ответ 23
Если вы используете ndb, метод, который работал у меня для очистки хранилища данных:
ndb.delete_multi(ndb.Query(default_options=ndb.QueryOptions(keys_only=True)))
Ответ 24
Для любого хранилища данных, которое в приложении, а не локальном, вы можете использовать новый API Datastore. Здесь учебник для начала работы.
Я написал script, который удаляет все нестроенные объекты. 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()
Ответ 25
-
продолжение идеи svpino - это мудрость для повторного использования записей, отмеченных как delete. (его идея заключалась не в том, чтобы удалить, но пометить как "удаленные" неиспользуемые записи). немного кэша /memcache для обработки рабочей копии и записи только разности состояний (до и после желаемой задачи) в хранилище данных сделает его лучше. для больших задач можно записать itermediate разброс кусков в хранилище данных, чтобы избежать потери данных, если memcache исчез. чтобы сделать его неприемлемым, можно проверить целостность/существование результатов memcached и перезапустить задачу (или обязательную часть) для повторения отсутствующих вычислений. когда разность данных записывается в хранилище данных, требуемые вычисления отбрасываются в очереди.
-
Другая идея, похожая на карту, сводится к тому, чтобы тип объекта shard несколько различных типов сущностей, поэтому он будет собран вместе и видимым как отдельный объект для конечного пользователя. записи отмечены только как "удаленные". когда количество удаленных записей за каждый осколок преодолевает некоторый предел, "живые" записи распределяются между другими осколками, и этот осколок закрыт навсегда, а затем удаляется вручную из dev-консоли (угадать при меньшей стоимости).upd: кажется, нет капли таблицу на консоли, удаляйте запись по записи по обычной цене. -
можно удалить по запросу куски большого набора записей без отказа gae (по крайней мере, работает локально) с возможностью продолжить в следующей попытке, когда время закончится:
qdelete.getFetchPlan().setFetchSize(100);
while (true)
{
long result = qdelete.deletePersistentAll(candidates);
LOG.log(Level.INFO, String.format("deleted: %d", result));
if (result <= 0)
break;
}
- также иногда полезно сделать дополнительное поле в первичной таблице вместо того, чтобы помещать кандидатов (связанные записи) в отдельную таблицу. и да, поле может быть неиндексированным/сериализованным массивом с небольшими затратами на вычисление.
Ответ 26
Для всех людей, которым требуется быстрое решение для dev-сервера (как время написания в феврале 2016 года):
- Остановите сервер dev.
- Удалить целевой каталог.
- Восстановить проект.
Это уничтожит все данные из хранилища данных.
Ответ 27
Для 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);
Хорошо работает в сервере разработки