Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

App Engine local datastore content does not persist

I'm running some basic test code, with web.py and GAE (Windows 7, Python27). The form enables messages to be posted to the datastore. When I stop the app and run it again, any data posted previously has disappeared. Adding entities manually using the admin (http://localhost:8080/_ah/admin/datastore) has the same problem.

I tried setting the path in the Application Settings using Extra flags:

--datastore_path=D:/path/to/app/

(Wasn't sure about syntax there). It had no effect. I searched my computer for *.datastore, and couldn't find any files, either, which seems suspect, although the data is obviously being stored somewhere for the duration of the app running.

from google.appengine.ext import db
import web

urls = (
    '/', 'index',
    '/note', 'note',
    '/crash', 'crash'
)

render = web.template.render('templates/')

class Note(db.Model):
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

class index:
    def GET(self):
            notes = db.GqlQuery("SELECT * FROM Note ORDER BY date DESC LIMIT 10")
            return render.index(notes)

class note:
    def POST(self):
            i = web.input('content')
            note = Note()
            note.content = i.content
            note.put()
            return web.seeother('/')

class crash:
    def GET(self):
            import logging
            logging.error('test')
            crash

app = web.application(urls, globals())

def main():
    app.cgirun()

if __name__ == '__main__':
  main()

UPDATE: When I run it via command line, I get the following:

WARNING  2012-04-06 19:07:31,266 rdbms_mysqldb.py:74] The rdbms API is not available because the MySQLdb library could not be loaded.
INFO     2012-04-06 19:07:31,778 appengine_rpc.py:160] Server: appengine.google.com
WARNING  2012-04-06 19:07:31,783 datastore_file_stub.py:513] Could not read datastore data from c:\users\amy\appdata\local\temp\dev_appserver.datastore
WARNING  2012-04-06 19:07:31,851 dev_appserver.py:3394] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2012-04-06 19:07:32,052 dev_appserver_multiprocess.py:647] Running application dev~palimpsest01 on port 8080: http://localhost:8080
INFO     2012-04-06 19:07:32,052 dev_appserver_multiprocess.py:649] Admin console is available at: http://localhost:8080/_ah/admin

Suggesting that the datastore... didn't install properly?

like image 579
rhiaro Avatar asked Apr 06 '12 18:04

rhiaro


1 Answers

As of 1.6.4, we stopped saving the datastore after every write. This method did not work when simulating the transactional model found in the High Replication Datastore (you would lose the last couple writes). It is also horribly inefficient. We changed it so the datastore dev stub flushes all writes and saves its state on shut down. It sounds like the dev_appserver is not shutting down correctly. You should see:

Applying all pending transactions and saving the datastore

in the logs when shutting down the server (see source code and source code). If you don't, it means that the dev_appserver is not being shut down cleanly (with a TERM signal or KeyInterrupt).

like image 192
Alfred Fuller Avatar answered Sep 18 '22 17:09

Alfred Fuller