2016-09-28 1 views
1

Was ist der Unterschied zwischen der Verwendung von scoped_session explizit:Unterschied zwischen sqlalchemy scoped_session (..) und scoped_session (..)()

engine = create_engine(url) 
session = scoped_session(sessionmaker(bind=engine)) 

session.add(..) 
session.commit() 
session.remove() 

session.add(..) 
session.commit() 
session.remove() 

und Erstellen Instanz scoped_session Objekt:

engine = create_engine(url) 
session = scoped_session(sessionmaker(bind=engine)) 

session().add(..) 
session().commit() 
session.remove() 

session().add(..) 
session().commit() 
session.remove() 

Sqlalchemy Immer die gleiche Sitzung für den gleichen Thread durch den Aufruf session() zurückgeben:

>> session() is session() 
True 
>> session is session() 
False 

Ist das eine geeignete Methode zum Bearbeiten einer Verbindung in einer Multithread-Umgebung? Wenn ja, warum erlaubt sqlalchemy Abfragen mit session anstelle von session()?

Antwort

1

"scoped_session" gibt ein Factory-Objekt zurück, daher müssen Sie die Factory aufrufen, um eine Instanz zurückzugeben. "scoped_session" gibt die gleiche Sitzung zurück, wenn sie aus demselben Bereich aufgerufen wird (in fast jedem Anwendungsfall ist der Bereich individuelle Benutzeranforderungen an eine Webseite).

Also, obwohl Sie session() wiederholt aufrufen, erstellt es nicht tatsächlich mehrere Sitzungen, aber die gleiche wird jedes Mal zurückgegeben.

Ich empfehle, ein großes S zu verwenden, um die Tatsache zu kennzeichnen, dass die Sitzung eine Fabrik und keine Instanz eines Objekts ist.

Mehr Dokumentation hier in viel mehr Detail zu gehen, als ich es tat: http://docs.sqlalchemy.org/en/latest/orm/contextual.html

EDIT: Beide Wege werden das gleiche Objekt zuzugreifen. Ich habe es immer klarer gefunden, eine Instanz von scoped_session zu erzeugen (nicht alle Fabriken bieten Funktionen wie diese), aber beide greifen auf das lokale Thread-Sitzungsobjekt zu.

http://docs.sqlalchemy.org/en/latest/orm/contextual.html#implicit-method-access

+0

vorsichtig mit der Terminologie. Ein Generator in Python ist eine sehr spezifische Sache; Von einer "Fabrik" sprichst du. – univerio

+0

"" scoped_session "gibt ein Generator-Objekt zurück, also müssen Sie den Generator aufrufen, um eine Instanz zurückzugeben" - das Beste ist, dass ich nicht muss, weil beide funktionieren: 'Session.commit()' und 'Session(). commit() '. Und die Frage war, was ist der Unterschied? Vielleicht funktioniert 'Session(). Commit()' in Multi-Threading während 'Session.commit()' nicht? – User

+1

Meine Antwort wurde aktualisiert. Im Grunde gibt die Factory automatisch die richtige lokale Thread-Sitzung zurück. Ich finde diese Funktionalität unklar, aber zu jeder für sich. – ApolloFortyNine

Verwandte Themen