87

It seems there is no equivalent of Python App Engine's _ah/admin for the Java implementation of Google App Engine.

Is there a manual way I can browse the datastore? Where are the files to be found on my machine? (I am using the App Engine plugin with Eclipse on OS X).

7 Answers 7

111

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

Sign up to request clarification or add additional context in comments.

3 Comments

New admin interface is still not working with kinds/entities created by Native Datastore API. So I still need my "viewer" :)
localhost:8888/_ah/admin worked like a champ for me (note the port changed) - but I will try out the AppWrench just for comparison.
Thank you so much! I really needed this to debug a persistence issue.
40

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.

4 Comments

This is redundant -- see dfrankow's post above.
You mean the link to the blog post that was posted several days after I posted this reply? 'outdated' I'll accept, but redundant and voted down is a bit cruel.
I agree. Good answer at the time; now outdated.
@mcherm this one worked for me. The other answers here, on the other side, didn't.
6

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

1 Comment

The code is good, but the parameter for the query constructor is wrong: Table is not correct, it mus be the Entity name. In the guestbook example it would be "greeting" which is the row. I tried this, but not working:final Query query = new Query("Guestbook/Greeting"); Another issue: How do you show the content of different keys/names of a table with your code? Like guestbook1, gb2, etc.
2

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.

Comments

1

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.

1 Comment

This code looks for all your entities and their child entities, what if the child entities have children too ? will this function run as recursion ?
1

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.

Comments

0

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

gcloud auth application-default login

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.