App Engine:如何“重置”数据存储区?

Posted

技术标签:

【中文标题】App Engine:如何“重置”数据存储区?【英文标题】:App Engine: How to "reset" the datastore? 【发布时间】:2010-11-12 09:25:44 【问题描述】:

嗯,我正在使用 App Engine (Java) 进行开发,经过大量尝试和部署后,我需要重置数据存储区。我添加了很多随机数据来测试性能,而且实体变化很大,所以我需要删除所有:数据、表、索引。

我该怎么做?

【问题讨论】:

【参考方案1】:

SQL 中没有等效于 DROP TABLE 或 TRUNCATE TABLE 的内置命令。您只需要在您的应用程序中创建一个“删除所有内容”页面,然后通过脚本重复调用该页面。在该页面中,您希望删除尽可能多的实体,但您仍然可以合理地期望在请求超时之前完成。确切的代码取决于您使用的是 JDO/JPA 还是低级 API。 (低级 API 会更快,因为您可以使用批处理操作。)

这个previous SO 问题几乎相同,仅适用于 Python

【讨论】:

我正在使用 JPA。这也会删除索引吗? 每次删除内容时都需要更新索引,否则使用索引的查询将返回错误数据。因此,当您删除实体 X 时,所有指向 X 的索引条目也应该被删除。最终,当您删除所有实体时,您将拥有空索引。 首先使用 appcfg 删除索引是个好主意 - 它会使删除过程更快,并使其消耗更少的 CPU 更新您将要删除的索引。【参考方案2】:

很抱歉这么晚了,但我只是想自己做同样的事情......

我登录到我的帐户 (appengine.google.com) 并找到通过管理实用程序 (datastore/dataviewer) 浏览数据存储区的选项...允许创建/更新/删除。

【讨论】:

如果您调整 URL 中的 limit=20,您可以提高限制。在我的情况下,增加到 100 让我在几个请求中删除一大块数据(并节省了我编写工具/页面来执行此操作的时间)。【参考方案3】:

删除应用程序的全部(或部分)数据现在是管理控制台的一部分

要启用此功能,只需在您的 app.yaml 文件中启用以下内置函数:

builtins:
- datastore_admin: on

将这些行添加到 app.yaml 可启用应用管理控制台中的“Datastore Admin”页面

【讨论】:

【参考方案4】:

根据 GAE 文档,您可以在 JDO 中删除多个对象,使用对象集合调用 PersistenceManager 的 deletePersistentAll(...) 方法。

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

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

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

pm.deletePersistentAll(objs);

【讨论】:

【参考方案5】:

很抱歉唤醒这个线程,但以防万一我想为像我这样的菜鸟添加一个提示(最终在谷歌文档中找到了答案):

如果您想一次性重置 Local 数据存储(例如在使用 eclipse 开发时),请关闭服务器,找到文件“local_db.bin”在您的项目中(应该在 WEB-INF/appengine-generated/ 目录中),然后将其删除。

用 java 很好用,还没有用 python 试过。

++

【讨论】:

Intellij 路径:PROJECT_ROOT\out\artifacts\PROJECT_NAME_war_exploded\WEB-INF\appengine-generated\local_db.bin 这是本地开发的正确答案。目前在 GCE 中,您应该使用允许您删除一个或多个表的 Datastore Admin。【参考方案6】:

清除开发服务器数据存储区

开发网络服务器使用本地版本的数据存储来测试您的应用程序,使用临时文件。只要临时文件存在,数据就会一直存在,除非您要求,否则 Web 服务器不会重置这些文件。

如果您希望开发服务器在启动之前擦除其数据存储,请在启动服务器时使用 --clear_datastore 选项:

dev_appserver.py --clear_datastore 你好世界/

Using the Datastore

【讨论】:

非常老的线程,我知道……但无论如何,在 GoogleAppEngineLauncher 的“应用程序设置”菜单中还有一个复选框“启动时清除数据存储”。至少在 Mac OS X 的 1.8.8 版本中 如果您使用的是 Mac,则可能需要使用 --clear_datastore=1【参考方案7】:

在我的情况下(使用 eclipse 插件和播放框架)我必须停止应用程序,删除文件 /apps/crud-gae/tmp/datastore 然后重新启动应用程序

它对我有用……当然是在本地工作……

【讨论】:

【参考方案8】:

只需执行一个不带过滤器的查询来获取所有实体,然后将它们一一删除。

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());      
       

【讨论】:

这在本地嵌入数据存储时非常有用,无需真正启动服务器的开销 把datastore.delete(result.getKey());在 try/catch(IllegalArgumentException e) 中避免以 __ 开头和结尾的键名保留且无法删除【参考方案9】:

在本地工作时,在 Windows 7 上,该文件为 user\UserName\AppData\Local\Temp\dev_appserver.datastore

【讨论】:

【参考方案10】:

我正在使用带有 Google Coursebuilder 的应用引擎,并且必须使用此命令来清除数据存储区:

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

【讨论】:

【参考方案11】:

java dev 的上下文无关,但由于文档很少,这里是如何在 go 中进行的:

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

【讨论】:

【参考方案12】:

如果您在项目中使用 maven,则只需执行“mvn clean install”即可。这当然会在本地重置数据存储。

【讨论】:

【参考方案13】:

打开http://localhost:8000/datastore即可删除本地数据

【讨论】:

【参考方案14】:

添加另一个有用的信息:如果使用 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.

【讨论】:

以上是关于App Engine:如何“重置”数据存储区?的主要内容,如果未能解决你的问题,请参考以下文章

App Engine:每次关闭计算机时都会清除开发数据存储区。如何避免这种情况?

python Google App Engine:将CSV导入数据存储区

从 Google App Engine 数据存储区获取随机记录?

数据存储区中的 Google App Engine 版本控制

Google App Engine 数据存储区中不精确查询的良好模式是啥?

将来自 Android 应用程序的数据存储在 App Engine 数据存储区中