2009-07-20 2 views
27

Ну, я развиваюсь в App Engine (Java), и после множества попыток и развертываний мне нужно сбросить хранилище данных. В тестовую производительность добавлено множество случайных данных, и кроме того, сущности сильно изменились, поэтому мне нужно удалить все: данные, таблицы, индексы.App Engine: Как «перезагрузить» хранилище данных?

Как я могу это сделать?

ответ

15

В SQL нет встроенной команды, эквивалентной таблице DROP TABLE или TRUNCATE TABLE. Вам просто нужно создать страницу «удалить все» в своем приложении, а затем повторно вызвать эту страницу через скрипт. На этой странице вы хотите удалить столько объектов, сколько еще можете ожидать до завершения запроса. Точный код зависит от того, используете ли вы JDO/JPA или API низкого уровня. (АНИ низкий уровень будет быстрее, потому что вы можете использовать пакетные операции.)

Это previous SO вопрос в значительной степени то же самое, только для Python

+0

Я использую JPA. Будет ли это также удалять индексы? – Damian

+2

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

+0

Отлично, еще раз спасибо Питер! – Damian

4

жаль, что так поздно, но я просто пытался сделать то же самое сам ...

Я вошел в свой аккаунт (appengine.google.com) и нашел возможность просматривать хранилище данных с помощью утилиты администратора (datastore/dataviewer) ..., которая позволяет создавать/обновлять/Удалить.

+0

Несомненно, но вы не можете удалить все объекты одновременно, не так ли? – Damian

+0

Нет, всего 20 за раз. – RyanW

+9

Если вы настроите предел = 20 в URL-адресе, вы можете подняться до предела. В моем случае, увеличившись до 100, позвольте мне удалить кусок данных в пару запросов (и сохранил меня, написав инструмент/страницу, чтобы сделать это). –

2

Удалить все (или часть) данных вашего приложения является частью консоли администратора

Чтобы включить эту функцию, просто включите следующие встроенные в файл app.yaml:

builtins: 
- datastore_admin: on 

Добавление этих строк в app.yaml позволяет создать страницу «Администратор хранилища данных» в консоли администратора приложения

2

В соответствии с документами GAE вы можете удалить несколько объектов в JDO, вызвать метод deletePersistentAll (...) PersistenceManager с помощью коллекции объектов ,

PersistenceManager pm = PMF.get().getPersistenceManager(); 

Query query = pm.newQuery("select from " + Your.class); 

List<Your> objs = (List<Your>) query.execute(); 

pm.deletePersistentAll(objs); 
29

К сожалению, чтобы разбудить эту тему, но только в случае, если я хотел бы добавить наконечник для нубов, как я (наконец-то нашел ответ в Google документации):

Если вы хотите сбросить Локальный datastore (например, при разработке с использованием eclipse) все сразу, выключите сервер, найдите файл «local_db.bin» в вашем проекте (должен быть в каталоге WEB-INF/appengine-generated /), и удалите его.

Работает отлично с java, не пробовал еще с python.

++

+0

Intellij path: PROJECT_ROOT \ out \ artifacts \ PROJECT_NAME_war_exploded \ WEB-INF \ appengine-generated \ local_db.bin – unify

+0

Это правильный ответ для локальной разработки. В настоящее время в GCE вы должны использовать Datastore Admin, который позволяет отбрасывать одну или несколько таблиц. –

15

Очистка Разработка сервер Datastore

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

Если вы хотите, чтобы сервер разработки, чтобы стереть его хранилище до запуска, используйте --clear_datastore опцию при запуске сервера:

dev_appserver.py --clear_datastore HelloWorld/

Using the Datastore

+0

очень старая тема, я знаю ... но так или иначе, есть также флажок «Очистить хранилище данных при запуске» в меню «Настройки приложения» в GoogleAppEngineLauncher. по крайней мере, в версии 1.8.8 для Mac OS X – PierrOz

+1

Если вы находитесь на Mac, вам может потребоваться использовать '--clear_datastore = 1'. –

0

в моем случае (работа с плагином eclipse и игровым фреймворком) Мне пришлось остановить приложение, удалить файл/apps/crud-gae/tmp/datastore, а затем перезапустить a С.

он работал для меня ... работать на местном уровне, конечно ...

9

Просто выполнить запрос без фильтра, чтобы извлечь все объекты и удалять их по одному.

import javax.servlet.http.*; 

import com.google.appengine.api.datastore.DatastoreService; 
import com.google.appengine.api.datastore.DatastoreServiceFactory; 
import com.google.appengine.api.datastore.Entity; 
import com.google.appengine.api.datastore.PreparedQuery; 
import com.google.appengine.api.datastore.Query; 

public class MyServlet extends HttpServlet { 
     public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 

     DatastoreService datastore = 
        DatastoreServiceFactory.getDatastoreService(); 

    Query mydeleteq = new Query(); 
    PreparedQuery pq = datastore.prepare(mydeleteq); 
    for (Entity result : pq.asIterable()) { 
     datastore.delete(result.getKey());  
    } 
} 
+0

Это отлично работает при встраивании хранилища данных локально без накладных расходов при запуске сервера – xamde

+2

Поместите datastore.delete (result.getKey()); в try/catch (IllegalArgumentException e) {}, чтобы избежать ввода имен ключей, начинающихся и заканчивающихся __, которые зарезервированы и не могут быть удалены. –

+0

Это было полезно, спасибо! –

0

При работе на местном уровне, на Windows 7 файл пользователя \ UserName \ AppData \ Local \ Temp \ dev_appserver.datastore

0

Я использовал приложение двигатель с Google Coursebuilder и пришлось использовать эту команду, чтобы очистить хранилище данных:

python dev_appserver.py --clear_datastore /path/to/app 
-1

Это не работает для меня.

У меня есть приложение GAE, в котором мне нужно вначале регистрировать меня.

Я удалил файл local_db.bin (у меня есть больше файлов в этой папке: datastore-indexes-auto.xml и local_search.bn). Я снова открыл свой проект и запускаю его как. Когда я запускаю свой основной .jsp, он загружает запрос из моего хранилища данных, но у меня нет данных в моем хранилище данных и спрашиваю меня о моей PMF (фабрике постоянных менеджеров).

Должен ли я удалять больше вещей?

Точно, я пытаюсь открыть: localhost: 8888/_ah/admin/но он не найден.

Diego.

0

Из контекста для Java разработчика, но так как там мало документации вот как сделать это в ходу:

keys, _ := datastore.NewQuery("").KeysOnly().GetAll(c, nil) 
datastore.DeleteMulti(c, keys) 
1

Если вы используете Maven в вашем проекте, вы можете просто сделать «МВН чистой установки». Это, конечно, сбросит хранилище данных.

0

Чтобы добавить еще немного полезной информации: При использовании Eclipse, и вы хотите, чтобы очистить местное хранилище данных, обратите внимание на эту консоль сообщ:

INFO: Local Datastore initialized: 
Storage: C:\Users\eric\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\appname\WEB-INF\appengine-generated\local_db.bin 

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

INFO: The backing store, C:\Users\eric\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\appname\WEB-INF\appengine-generated\local_db.bin, does not exist. It will be created. 
Смежные вопросы