scoped_session SQLAlchemy

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Vermutlich liegt es daran, dass du mit SQLite nur im RAM arbeitest.
Versuch das mal mit einer Datei.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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.
Antworten