【问题标题】:How to browse local Java App Engine datastore?如何浏览本地 Java App Engine 数据存储?
【发布时间】:2010-11-09 07:14:58
【问题描述】:

对于 Google App Engine 的 Java 实现,似乎没有 Python App Engine 的 _ah/admin 等效项。

是否可以通过手动方式浏览数据存储?我的机器上的文件在哪里? (我在 OS X 上使用带有 Eclipse 的 App Engine 插件)。

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore


    【解决方案1】:

    对我来说,解决方法是使用下面的gcloud 命令登录

    gcloud auth application-default login
    

    【讨论】:

      【解决方案2】:

      使用文本编辑器(如 Notepad++)打开 \war\WEB-INF\appengine-generated\local_db.bin 文件。

      数据被打乱了,但至少你可以阅读它,你可以复制它来提取它。

      【讨论】:

        【解决方案3】:

        http://googleappengine.blogspot.com/2009/07/google-app-engine-for-java-sdk-122.html: "终于,开发应用服务器有一个数据查看器。在本地启动您的应用,然后将您的浏览器指向 http://localhost:8888/_ah/admin http://localhost:8000/datastore* 以查看它。"

        * 截至 1.7.7

        【讨论】:

        • 新的管理界面仍然无法与 Native Datastore API 创建的种类/实体一起使用。所以我仍然需要我的“观众”:)
        • localhost:8888/_ah/admin 对我来说就像一个冠军(注意端口已更改) - 但我会尝试 AppWrench 只是为了进行比较。
        • 非常感谢!我真的需要这个来调试持久性问题。
        【解决方案4】:

        在最新版本的 SDK (1.7.6+) 中,开发服务器的管理部分随之更改了位置

        分析服务器输出日志,我们可以看到它可以在以下位置访问:

        http://localhost:8000

        还有 Datastore 查看器:

        http://localhost:8000/datastore

        看起来很整洁 - 根据 google 的新设计指南。

        【讨论】:

          【解决方案5】:

          目前没有适用于 Java SDK 的数据存储查看器 - 下一个 SDK 版本中应该会提供。与此同时,您最好的选择是编写您自己的管理界面和数据存储查看代码 - 或者等待下一个 SDK 版本。

          Java App Engine 现在有一个本地数据存储查看器,可通过http://localhost:8080/_ah/admin 访问。

          【讨论】:

          • 这是多余的——参见上面 dfrankow 的帖子。
          • 您是指我发布此回复 几天后发布的博客文章的链接? “过时”我会接受,但多余和被否决有点残忍。
          • 我同意。当时的好答案;现在已经过时了。
          • @mcherm 这个对我有用。另一方面,这里的其他答案没有。
          【解决方案6】:

          因为 Google App Engines Datastore 查看器不支持显示引用实体的集合,所以我修改了 Paul 的版本以显示所有后代实体:

          public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
              String entityParam = req.getParameter("e");
          
              resp.setContentType("text/plain");
              final DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
          
              // Original query
              final Query queryOrig = new Query(entityParam);
              queryOrig.addSort(Entity.KEY_RESERVED_PROPERTY, Query.SortDirection.ASCENDING);
          
              for (final Entity entityOrig : datastore.prepare(queryOrig).asIterable()) {
          
                  // Query for this entity and all its descendant entities and collections
                  final Query query = new Query();
                  query.setAncestor(entityOrig.getKey());
                  query.addSort(Entity.KEY_RESERVED_PROPERTY, Query.SortDirection.ASCENDING);
          
                  for (final Entity entity : datastore.prepare(query).asIterable()) {
                      resp.getWriter().println(entity.getKey().toString());
          
                      // Print properties
                      final Map<String, Object> properties = entity.getProperties();
                      final String[] propertyNames = properties.keySet().toArray(new String[properties.size()]);
                      for(final String propertyName : propertyNames) {
                          resp.getWriter().println("-> " + propertyName + ": " + entity.getProperty(propertyName));
                      }
                  }
              }
          }
          

          需要注意的是,空集合/引用的实体不会显示任何内容。

          【讨论】:

          • 此代码查找您的所有实体及其子实体,如果子实体也有子实体怎么办?这个函数会以递归方式运行吗?
          【解决方案7】:

          我的 Windows+Eclipse 环境在 \war\WEB-INF\appengine-generated\local_db.bin 上有本地数据存储

          据我了解,它使用名为“协议缓冲区”的内部格式。我没有外部工具来以人类可读的格式呈现文件。

          我正在使用这样的简单“查看器”代码:

          public void doGet(HttpServletRequest req, HttpServletResponse resp) 
              throws IOException 
          {
          
              resp.setContentType("text/plain");
          
              final DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
              final Query query = new Query("Table/Entity Name");
              //query.addSort(Entity.KEY_RESERVED_PROPERTY, Query.SortDirection.DESCENDING);
          
              for (final Entity entity : datastore.prepare(query).asIterable()) {
                  resp.getWriter().println(entity.getKey().toString());
          
                  final Map<String, Object> properties = entity.getProperties();
                  final String[] propertyNames = properties.keySet().toArray(
                      new String[properties.size()]);
                  for(final String propertyName : propertyNames) {
                      resp.getWriter().println("-> " + propertyName + ": " + entity.getProperty(propertyName));
                  }
              }
          }
          

          【讨论】:

          • 代码不错,但是查询构造函数的参数错误:表不正确,应该是实体名。在留言簿示例中,它将是“问候”,即行。我试过这个,但不工作:final Query query = new Query("Guestbook/Greeting");另一个问题:如何使用代码显示表的不同键/名称的内容?比如guestbook1、gb2等
          猜你喜欢
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-18
          相关资源
          最近更新 更多