Come sfogliare il datastore Java App Engine locale?


84

Sembra che non ci sia equivalente di _ah / admin di Python App Engine per l'implementazione Java di Google App Engine.

Esiste un modo manuale per navigare nel datastore? Dove si trovano i file sulla mia macchina? (Sto usando il plug-in App Engine con Eclipse su OS X).

Risposte:


111

http://googleappengine.blogspot.com/2009/07/google-app-engine-for-java-sdk-122.html : "Finalmente, il dev appserver ha un visualizzatore di dati. Avvia la tua app localmente e punta il tuo browser su * per verificarlo. "http://localhost:8888/_ah/admin http://localhost:8000/datastore

* a partire dal 1.7.7


La nuova interfaccia di amministrazione continua a non funzionare con i tipi / entità creati dall'API Native Datastore. Quindi ho ancora bisogno del mio "spettatore" :)
Paul

15
localhost: 8888 / _ah / admin ha funzionato come un campione per me (nota che la porta è cambiata) - ma proverò l'AppWrench solo per confronto.
Chad Gorshing

Grazie mille! Ne avevo davvero bisogno per eseguire il debug di un problema di persistenza.
SunnyD

40

Al momento non esiste un visualizzatore di datastore per Java SDK: uno dovrebbe essere disponibile nella prossima versione di SDK. Nel frattempo, la soluzione migliore è scrivere la tua interfaccia di amministrazione con il codice di visualizzazione del datastore o attendere la prossima versione dell'SDK.

Java App Engine ora dispone di un visualizzatore di archivio dati locale, accessibile all'indirizzo http://localhost:8080/_ah/admin.


Questo è ridondante - vedi il post di dfrankow sopra.
Julian H

23
Intendi il link al post del blog che è stato pubblicato diversi giorni dopo che ho pubblicato questa risposta? "obsoleto" lo accetto, ma ridondante e bocciato è un po 'crudele.
Nick Johnson,

1
Sono d'accordo. Buona risposta al momento; ora obsoleto.
mcherm

@mcherm questo ha funzionato per me. Le altre risposte qui, dall'altra parte, no.
Johnny

6

Ho un datastore locale sul mio ambiente Windows + Eclipse su \ war \ WEB-INF \ appengine-generated \ local_db.bin

Per quanto ho capito, utilizza un formato interno denominato "buffer di protocollo". Non ho strumenti esterni per presentare il file in un formato leggibile dall'uomo.

Sto usando un semplice codice "visualizzatore" come questo:

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

Il codice è buono, ma il parametro per il costruttore della query è sbagliato: la tabella non è corretta, deve essere il nome dell'entità. Nell'esempio del libro degli ospiti sarebbe "saluto" che è la riga. Ho provato questo, ma non funziona: query finale di query = nuova query ("Guestbook / saluto"); Un altro problema: come mostri il contenuto di chiavi / nomi diversi di una tabella con il tuo codice? Come guestbook1, gb2, ecc.
Timo

2

Nelle versioni più recenti dell'SDK ( 1.7.6+ ), la parte amministrativa del server di sviluppo viene fornita con il cambio di posizione

Analizzando i log di output del server possiamo vedere che è accessibile a:

http://localhost:8000

E il visualizzatore Datastore :

http://localhost:8000/datastore

Sembra abbastanza pulito, secondo le nuove linee guida di progettazione di Google.


1

Poiché il visualizzatore Datastore di Google App Engines non supporta la visualizzazione di raccolte di entità di riferimento, ho modificato la versione di Paul per visualizzare tutte le entità discendenti:

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

Va notato che non viene visualizzato nulla per raccolte vuote / entità referenziate.


Questo codice cerca tutte le tue entità e le loro entità figlio, cosa succede se anche le entità figlio hanno figli? questa funzione verrà eseguita come ricorsione?
Pini Cheyni

1

Apri il \war\WEB-INF\appengine-generated\local_db.binfile con un editor di testo, come Notepad ++.

I dati sono codificati ma almeno puoi leggerli e copiarli per estrarli.


0

Per me la soluzione era eseguire il login utilizzando il gcloudcomando seguente

gcloud auth application-default login
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.