Jak przeglądać lokalny magazyn danych Java App Engine?


84

Wygląda na to, że nie ma odpowiednika _ah / admin Python App Engine dla implementacji Google App Engine w Javie.

Czy istnieje ręczny sposób przeglądania magazynu danych? Gdzie na moim komputerze znajdują się pliki? (Używam wtyczki App Engine z Eclipse na OS X).

Odpowiedzi:


111

http://googleappengine.blogspot.com/2009/07/google-app-engine-for-java-sdk-122.html : „Nareszcie dev appserver ma przeglądarkę danych. Uruchom aplikację lokalnie i wskaż przeglądarkę na *, aby to sprawdzić ”.http://localhost:8888/_ah/admin http://localhost:8000/datastore

* od 1.7.7


Nowy interfejs administratora nadal nie działa z rodzajami / jednostkami utworzonymi przez Native Datastore API. Więc nadal potrzebuję mojej "przeglądarki" :)
Paul

15
localhost: 8888 / _ah / admin działał dla mnie jak mistrz (zauważ, że zmienił się port) - ale spróbuję AppWrench tylko dla porównania.
Chad Gorshing

Dziękuję bardzo! Naprawdę potrzebowałem tego do debugowania problemu trwałości.
SunnyD

40

Obecnie nie ma przeglądarki datastore dla Java SDK - powinna pojawić się w następnej wersji SDK. W międzyczasie najlepiej jest napisać własny interfejs administratora z kodem do przeglądania datastore - lub poczekać na następną wersję SDK.

Java App Engine ma teraz lokalną przeglądarkę datastore, dostępną pod adresem http://localhost:8080/_ah/admin.


To jest zbędne - patrz post dfrankowa powyżej.
Julian H

23
Masz na myśli link do posta na blogu, który został opublikowany kilka dni po wysłaniu tej odpowiedzi? „przestarzały” Zaakceptuję, ale zbędny i odrzucony jest nieco okrutny.
Nick Johnson

1
Zgadzam się. Dobra odpowiedź w tamtym czasie; teraz nieaktualne.
mcherm

@mcherm ten działał dla mnie. Inne odpowiedzi tutaj, po drugiej stronie, nie.
Johnny

6

Mam lokalny magazyn danych w swoim środowisku Windows + Eclipse na \ war \ WEB-INF \ appengine-generated \ local_db.bin

O ile zrozumiałem, używa wewnętrznego formatu o nazwie „bufory protokołów”. Nie mam zewnętrznych narzędzi do prezentacji pliku w formacie czytelnym dla człowieka.

Używam prostego kodu przeglądarki, takiego jak ten:

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

Kod jest dobry, ale parametr konstruktora zapytania jest nieprawidłowy: tabela jest niepoprawna, musi to być nazwa jednostki. W przykładzie księgi gości byłoby to „powitanie”, które jest wierszem. Próbowałem, ale nie działało: końcowe zapytanie = nowe zapytanie ("Księga gości / Pozdrowienia"); Kolejna kwestia: Jak wyświetlić zawartość różnych kluczy / nazw tabeli z kodem? Jak księga gości1, gb2 itp.
Timo

2

W najnowszych wersjach SDK ( 1.7.6+ ) część administracyjna serwera deweloperskiego wraz z nią zmieniła swoją lokalizację

Analizując logi wyjściowe serwera widzimy, że jest on dostępny pod adresem:

http://localhost:8000

A przeglądarka Datastore :

http://localhost:8000/datastore

Wygląda całkiem schludnie - zgodnie z nowymi wytycznymi Google dotyczącymi projektowania.


1

Ponieważ przeglądarka Google App Engines Datastore nie obsługuje wyświetlania kolekcji obiektów, do których istnieją odniesienia, zmodyfikowałem wersję Paula, aby wyświetlała wszystkie jednostki podrzędne:

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

Należy zauważyć, że nic nie jest wyświetlane dla pustych kolekcji / obiektów, do których istnieją odniesienia.


Ten kod szuka wszystkich twoich bytów i ich bytów podrzędnych, a co jeśli byty podrzędne też mają dzieci? czy ta funkcja będzie działać jako rekurencja?
Pini Cheyni

1

Otwórz \war\WEB-INF\appengine-generated\local_db.binplik za pomocą edytora tekstu, takiego jak Notepad ++.

Dane są zaszyfrowane, ale przynajmniej możesz je odczytać i skopiować, aby je wyodrębnić.


0

Dla mnie poprawką było zalogowanie się za pomocą poniższego gcloudpolecenia

gcloud auth application-default login
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.