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

Dam*_*ian 29 google-app-engine google-cloud-datastore

好吧,我正在开发App Engine(Java),经过大量的尝试和部署,我需要重置数据存储区.我为测试性能添加了大量随机数据,除此之外,实体发生了很大变化,因此我需要删除所有:数据,表,索引.

我怎样才能做到这一点?

小智 30

很抱歉醒来这个帖子,但万一我想为像我这样的新手添加一个提示(最后在google文档中找到答案):

如果要一次性重置本地数据存储(例如在使用eclipse进行开发时),请关闭服务器,在项目中找到文件' local_db.bin '(应该在WEB-INF/appengine-generated /目录中) ),并删除它.

使用java工作正常,还没有尝试使用python.

++


Pet*_*ore 16

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

之前的 SO问题是几乎相同的,只是为Python

  • 首先使用appcfg删除索引是一个好主意 - 它会使删除过程更快,并导致它消耗更少的CPU更新索引,无论如何你都要删除. (5认同)
  • 每次删除时都需要更新索引,否则使用索引的查询将返回错误数据.因此,当您删除实体X时,也应删除指向X的所有索引条目.删除所有实体后,最终会有空索引. (2认同)

Tam*_*man 16

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

开发Web服务器使用本地版本的数据存储区来使用临时文件来测试您的应用程序.只要存在临时文件,数据就会一直存在,除非您要求它们执行此操作,否则Web服务器不会重置这些文件.

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

dev_appserver.py --clear_datastore helloworld /

使用数据存储区

  • 如果您使用的是Mac,则可能需要使用--clear_datastore = 1。 (2认同)

Hus*_*yam 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());      
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • put datastore.delete(result.getKey()); 在try/catch(IllegalArgumentException e){}中避免以__开头和结尾的键名保留且不能删除 (2认同)