SQLAlchemy: Erstellen im Vergleich zur Wiederverwendung einer Sitzung
Nur eine kurze Frage: SQLAlchemy redet aufrufen sessionmaker()
einmal, sondern ruft die daraus resultierenden Session()
Klasse jedes mal, wenn Sie sprechen müssen, um Ihre DB. Für mich bedeutet das, dass der zweite ich würde meine erste session.add(x)
oder etwas ähnliches, das würde ich erstmal
from project import Session
session = Session()
Was ich bis jetzt wurde das Gespräch session = Session()
in meinem Modell einmal und dann importieren immer der gleichen Sitzung überall in meiner Anwendung. Da dies einen web-Anwendungen würde dies in der Regel das gleiche bedeuten (wie eine Ansicht ausgeführt wird).
Aber wo ist der Unterschied? Was ist der Nachteil der Verwendung einer session die ganze Zeit gegen die Verwendung es für meine Datenbank-stuff bis die Funktion fertig ist und dann ein neues zu erstellen, das nächste mal will ich sprechen, um meine DB?
Bekomme ich das wenn ich mehrere threads, jeder sollte seine eigene session. Aber mit scoped_session()
ich bereits stellen Sie sicher, dass problem existiert nicht, muss ich?
Bitte klären sollten meine Annahmen falsch sind.
InformationsquelleAutor der Frage javex | 2012-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
sessionmaker()
ist ein Werk, das gibt es, Sie zu ermutigen Platzierung von Konfigurations-Optionen für die Erstellung von neuenSession
Objekte in nur einem Ort. Es ist optional, man könnte genauso gut nennenSession(bind=engine, expire_on_commit=False)
Wann immer Sie brauchte eine neueSession
außer dass die wortreich und redundant, und das wollte ich stoppen die Ausbreitung von kleinen "Helfern", den jeder näherte sich dem Problem dieser Redundanz in einige neue und verwirrende Art und Weise.So
sessionmaker()
ist nur ein Werkzeug, um Ihnen helfen, erstellenSession
Objekte, wenn Sie Sie benötigen.Nächsten Teil. Ich denke, die Frage ist, was ist der Unterschied zwischen einen neuen
Session()
an verschiedenen Punkten im Vergleich nur mit einer den ganzen Weg durch. Die Antwort, nicht sehr viel.Session
ist ein container für alle Objekte, die Sie hineingesteckt haben, und dann wird es auch verfolgt eine offene Transaktion. Im moment rufen Sierollback()
odercommit()
ist die Transaktion vorbei und derSession
hat keine Verbindung zu der Datenbank, bis es aufgerufen ist, zu emittieren SQL wieder. Links hält er zu den zugeordneten Objekten sind schwach referenzieren, vorausgesetzt, die Objekte sind sauber ausstehender änderungen, so dass auch in dieser Hinsicht dieSession
wird leer selbst heraus wieder zu einem neuen Staat, wenn Ihre Anwendung verliert alle Verweise auf zugeordnete Objekte. Wenn Sie lassen Sie es Ihre Standard -"expire_on_commit"
einstellen, dann werden alle Objekte, die abgelaufen sind nach einem commit. Wenn dasSession
hängt, um für fünf oder zwanzig Minuten, und alle Arten von Dingen, die sich geändert haben in der Datenbank das nächste mal, wenn Sie es benutzen, wird es das laden aller neuen Staat das nächste mal, wenn Sie Zugriff auf diese Objekte, auch wenn Sie schon sitzen im Speicher für zwanzig Minuten.In web-Anwendungen, die wir in der Regel sagen, hey warum gehst du nicht machen eine Marke neue
Session
auf jede Anfrage, anstatt die gleiche über und über wieder. Diese Praxis sorgt dafür, dass die neue Anforderung beginnt "sauber". Wenn einige Objekte aus der vorherigen Anfrage wurde noch nicht Müll gesammelt hast, und ob Sie vielleicht deaktiviert habe"expire_on_commit"
vielleicht einige Zustand aus der vorherigen Anfrage ist noch hängen herum, und dieser Staat könnte sogar ziemlich alt. Wenn du vorsichtig bist, zu verlassenexpire_on_commit
eingeschaltet und auf jeden Fall rufencommit()
oderrollback()
auf Anfrage Ende ist, dann ist es in Ordnung, aber wenn Sie beginnen, mit einer neuen MarkeSession
dann gibt es nicht mal irgendeine Frage, die Sie beginnen zu reinigen. So die Idee zu Beginn jeder Anfrage mit einer neuenSession
ist wirklich nur der einfachste Weg, um sicherzustellen, dass Sie beginnen frisch zu machen, und die Verwendung vonexpire_on_commit
ziemlich optional, da dieses flag kann entstehen eine Menge von zusätzlichen SQL für einen Vorgang, der nenntcommit()
in der Mitte einer Reihe von Operationen. Nicht sicher, ob dies Ihre Frage beantwortet.Die nächste Runde ist das, was Sie erwähnen, über threading. Wenn Ihre app ist multithreaded, empfehlen wir, dass die
Session
im Einsatz ist lokal auf...irgendwas.scoped_session()
standardmäßig macht es local auf den aktuellen thread. In einer web-app, die lokale, die Anfrage ist in der Tat noch besser. Flask-SQLAlchemy tatsächlich sendet eine benutzerdefinierte "scope-Funktion" zuscoped_session()
so dass man ein request-scoped-Sitzung. Die Durchschnittliche Pyramide Anwendungs-sticks, wird die Sitzung in den "Anfrage" - Registrierung. Bei der Verwendung von Schemata wie diese, die "create new Session " auf Anfrage starten" - Idee weiter zu schauen, wie der direkteste Weg, um die Dinge gerade.InformationsquelleAutor der Antwort zzzeek
Zusätzlich zu den hervorragenden zzzeek Antwort, hier ist ein einfaches Rezept, um schnell zu erstellen, Wegwerf -, in sich geschlossenen Sitzungen:
Verwendung:
InformationsquelleAutor der Antwort Berislav Lopac
Können Sie die Sitzung mit der db
InformationsquelleAutor der Antwort mcolak