2012-04-08 4 views
1

Wir hoffen auf einen Kommentar von der GAE Python-Team zu diesem Thema.GAE SDK 1.6.4 dev_appserver datastore flush

Hat sich zwischen 1.6.3 und 1.6.4 etwas geändert, was die Art und Weise angeht, wie der Datenspeicher dev_appserver beim Beenden der App auf die Festplatte geleert wird?

Ich benutze Django-Nonrel, und auf 1.6.3, und früher, konnte ich eine Python-Shell laden: Python manage.py Shell (manage.py wird von Django-Nonrel bereitgestellt)

Ich könnte dann meine Modelle importieren und den Datenspeicher zugreifen, Entitäten ändern und beenden.

In 1.6.4 kann ich das tun, aber wenn ich beende, werden Änderungen nicht im Datenspeicher gespeichert. Wenn ich django-nonrel als WSGI-App ausführe, wird es ordnungsgemäß gespeichert, und beim Beenden sehe ich eine Meldung ("Anwenden aller ausstehenden Transaktionen und Speichern des Datenspeichers").

+0

Etwas hat sich geändert. Ich werde herumfragen. –

+0

Danke Guido, ich habe einen Fix für Django-Nonrel gehackt. Ich vermute, dass alle anderen Python-Benutzer, die über die Python-Shell auf den Datenspeicher zugreifen wollen, ein ähnliches Problem haben. – dragonx

+0

Siehe Alfred Fullers Antwort auf http://stackoverflow.com/questions/10047315/app-engine-local-datastore-content-does-not-persist für eine Erklärung und Quelllinks. –

Antwort

3

Danke an dragonx für seine Lösung und Info. Ich lief mein devserver von Eclipse, und ich war erstaunt zu sehen, dass meine Daten nicht gespeichert werden nach dem Upgrade auf 1.6.4 Ich fügte einen Flush in die Datenbank nach jeder Webanforderung, um dies zu tun, implementierte ich eine Basisklasse für alle Anfragen und Überschreibung Versand:

developmentServer = False 

if os.environ.get('SERVER_SOFTWARE','').startswith('Development'): 
    developmentServer = True 

class BaseRequestHandler(webapp2.RequestHandler): 
    def dispatch(self): 
     retValue = super(BaseRequestHandler, self).dispatch() 
     if developmentServer: 
       from google.appengine.tools import dev_appserver 
       dev_appserver.TearDownStubs() 

     return retValue 

über eine Änderung wie die in der Release Notes im Verhalten zu informieren, habe mich gerettet zwei Tage Suche, was in meinem Upgrade falsch gelaufen ist.

+0

Dieser Code funktioniert unter Windows nicht. Ich habe versucht, die Anwendung auf dem Entwicklungsserver (1) mit Eclipse und (2) mit dem Google App Engine Launcher zu starten. In beiden Fällen, d. H. (1) Beenden der Konsole in Eclipse und (2) Beenden der Anwendung vom Startprogramm, werden Transaktionen nicht im Entwicklungsdatenspeicher gespeichert. Wer hat ähnliche Probleme unter Windows? Wer könnte mir dazu etwas sagen? – cv12

+0

Bestätigt, funktioniert nicht für mich unter Windows. –

+0

Ich änderte die Lösung in Eclipse arbeiten, speichern Sie die Datenbank jedes Mal wie vor google update – user1325188

2

Es sieht so aus, als hätte es einige Änderungen gegeben. Ich war in der Lage, um das Problem mit den folgenden zu hacken:

from google.appengine.tools import dev_appserver 
import atexit 
atexit.register(dev_appserver.TearDownStubs) 

Dies gewährleistet, dass der Datenspeicher beim Beenden gespült wird.

+0

Wenn Sie "python manage.py shell" oder "python manage.py createsuperuser" ausführen. Diese Fälle haben vorher nicht funktioniert. Wenn Sie "python manage.py runserver" ausführen, erhalten Sie den Flush zweimal, einmal vom SDK-Handler und einmal vom zusätzlichen Handler, den ich hinzugefügt habe.Ich bin nicht wirklich sicher, wie man die Python Shell exit() (verpasst von SDK) von SIGTERM/KeyInterrupt (gefangen von SDK) – dragonx

+0

Dank, weiß ich nicht, was ich falsch in meinem Beitrag dort getan habe, denke ich, ich gerade Kopieren und Einfügen falsch, aber der Code in meinem Quellbaum ist, was Sie hatten. Ich habe es bearbeitet, um es zu beheben. – dragonx

0

Vor 1.6.4 haben wir den Datenspeicher nach jedem Schreibvorgang gespeichert. Diese Methode funktioniert nicht beim Simulieren des Transaktionsmodells, das im Hochreplikationsdatenspeicher gefunden wird (Sie würden die letzten Schreibvorgänge verlieren). Es ist auch schrecklich ineffizient. Wir haben es so geändert, dass der Datastore-Dev-Stub alle Schreibvorgänge löscht und seinen Zustand beim Herunterfahren speichert.

der Code Folgende:

  1. https://bitbucket.org/wkornewald/djangoappengine/src/60c2b3339a9f/management/commands/runserver.py#cl-154
  2. http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_main.py#683

Es sieht aus wie manage.py, wenn der Server (mit einem TERM-Signal oder KeyInterrupt) sauber nach unten funktionieren soll geschlossen ist.

+0

Genau das sehe ich. Das Herunterfahren mit einem TERM-Signal oder KeyInterrupt wird ordnungsgemäß geleert. Das Beenden mit exit() in einer Python-Shell funktioniert nicht. Siehe meinen obigen Beitrag. Die Shell fängt KeyInterrupt ab, daher können Sie diesen Weg nicht verlassen, wenn Sie die Python-Shell verwenden. – dragonx

+1

Alfred, können Sie näher erläutern, was unter Windows passieren soll? 1.6.4 wird weder beim Debuggen von py_dev noch beim Beenden der Anwendung im Launcher gelöscht. –

Verwandte Themen