如何浏览本地Java App Engine数据存储?

87

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

我是否可以手动浏览数据存储?这些文件在我的计算机上的哪里可以找到?(我在OS X上使用Eclipse的App Engine插件)。

7个回答

111

新的管理界面仍然无法与使用本地数据存储API创建的种类/实体一起工作。所以我仍然需要我的“查看器” :) - Paul
15
http://localhost:8888/_ah/admin 对我来说一切正常(请注意端口已更改),但为了比较起见,我会尝试使用 AppWrench。 - Chad Gorshing
非常感谢!我真的需要这个来调试持久性问题。 - SunnyD

40

目前Java SDK没有数据存储查看器,但它将在下一次SDK发布时提供。同时,您最好编写自己的管理界面并包含数据存储查看代码,或者等待下一个SDK发布。

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


这是多余的 - 请参考上面dfrankow的帖子。 - Julian H
23
您是说我在发布这个回复几天之后才发布的博客文章的链接?“过时”我可以接受,但是“冗余”和“被投票降低”,有点过于严厉了。 - Nick Johnson
1
我同意。当时是个好答案,但现在已经过时了。 - mcherm
@mcherm 这个对我有用。另一方面,这里的其他答案却没有用。 - Johnny

6

我在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));
        }
    }
}

代码很好,但是查询构造器的参数是错误的:表格不正确,必须是实体名称。在留言簿示例中,它应该是“greeting”,即行。我尝试了这个,但是没有起作用:final Query query = new Query("Guestbook/Greeting")。另一个问题是:如何使用您的代码显示表格的不同键/名称的内容?例如guestbook1、gb2等。 - Timo

2
在最新版本的SDK(1.7.6+)中,开发服务器的管理部分已经改变了位置。
分析服务器输出日志,我们可以看到它可以通过以下地址访问: http://localhost:8000Datastore查看器则是: http://localhost:8000/datastore 看起来非常整洁 - 符合Google的新设计指南。

1

使用像Notepad++这样的文本编辑器打开\war\WEB-INF\appengine-generated\local_db.bin文件。

数据是乱码的,但至少您可以阅读它并复制提取它。


1

由于Google App Engines数据存储查看器不支持显示引用实体的集合,因此我修改了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));
            }
        }
    }
}

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


这段代码查找所有实体及其子实体,如果子实体也有子实体呢?这个函数会递归运行吗? - Pini Cheyni

0

对我来说,解决方法是使用以下gcloud命令进行登录

gcloud auth application-default login

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接