如何浏览本地 JavaAppEngine 数据存储?

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

有没有手动浏览数据存储的方法?我机器上的文件在哪里?(我正在 OS X 上使用带 Eclipse 的 App Engine 插件)。

41787 次浏览

I have local datastore on my Windows+Eclipse environment on \war\WEB-INF\appengine-generated\local_db.bin

As far as I understood it uses internal format named "protocol buffers". I don't have external tools to present the file in human-readable format.

I'm using simple "viewer" code like this:

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

There's currently no datastore viewer for the Java SDK - one should be coming in the next SDK release. In the meantime, your best bet is to write your own admin interface with datastore viewing code - or wait for the next SDK release.

Java App Engine now has a local datastore viewer, accessible at http://localhost:8080/_ah/admin.

http://googleappengine.blogspot.com/2009/07/google-app-engine-for-java-sdk-122.html: "At long last, the dev appserver has a data viewer. Start your app locally and point your browser to http://localhost:8888/_ah/admin http://localhost:8000/datastore* to check it out."

* as of 1.7.7

Because Google App Engines Datastore viewer does not support displaying collections of referenced entities, I modified Paul's version to display all descendant entities:

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

It should be noted that nothing is displayed for empty collections/referenced entities.

In the newest versions of the SDK (1.7.6+) the admin part of the dev server comes with it changed its location

Analyzing the server output logs we can see that it is accessible at:

http://localhost:8000

And the Datastore viewer:

http://localhost:8000/datastore

Looks pretty neat - according to google's new design guidlines.

Open the \war\WEB-INF\appengine-generated\local_db.bin file with a text editor, like Notepad++.

The data is scrambled but at least you can read it and you can copy to extract it.

For me the fix was to do the login using below gcloud command

gcloud auth application-default login