Seite 1 von 1

scoped_session SQLAlchemy

Verfasst: Donnerstag 28. Mai 2009, 20:54
von nemomuk
Hallo,

komme hier gerade mit der scoped_session nicht wirklich zurecht.

Code: Alles auswählen

database_engine = create_engine('sqlite:///:memory:', convert_unicode=True)
session = scoped_session(sessionmaker(bind=database_engine))
metadata = MetaData()

mapper = session.mapper
mapper(Exl, ex_table)
So erstelle ich meine Models plus Session.

Code: Alles auswählen

class T(threading.Thread):

    def run(self):
        while True:
            session.query(Ex).all()

if __name__ == '__main__':
    T().start()
Das Problem bei dieser Methode ist, dass wenn ich mehrere Threads starte, ein OperationalError kommt mit: locked database.

Code: Alles auswählen

class T(threading.Thread):

    def __init__(self):
         threading.Thread.__init__(self)
         self.session = session()

    def run(self):
        while True:
            session.query(Ex).all()

if __name__ == '__main__':
    T().start()
Ursprünglich hatte ich es sowieso so verstanden, dass ich pro Thread einfach die Session instantiieren muss.

Allerdings werden dann meine Sachen in der DB nicht gespeichert, wenn ich sowas hier im Thread mache:

Code: Alles auswählen

Ex(xy='xy')
self.session.commit()
Das Ganze wird ja automatisch zur Session hinzugefügt, da ich den session.mapper verwende - sieht man auch daran, dass wenn ich im gleichen Thread wieder einen query mache, dass die Objekte da sind. Anscheinend gecached - in der Datenbank sind sie aber nicht gespeichert.

Was mache ich da falsch?

Danke!

Verfasst: Dienstag 16. Juni 2009, 08:14
von ms4py
Vermutlich liegt es daran, dass du mit SQLite nur im RAM arbeitest.
Versuch das mal mit einer Datei.

Verfasst: Dienstag 16. Juni 2009, 16:43
von nemomuk
Nope, es liegt an SQLite allgemein, welches nicht 100%ig thread-safe ist... Mit "richtigen" Datenbank Management Systemen habe ich keine Probleme.

Danke trotzdem für deinen Vorschlag.