Ich verwende SQLAlchemy und es gibt mindestens drei Einheiten: engine
, session
und connection
, die haben execute
Methode, also wenn ich zum Beispiel möchte alle Datensätze auswählen aus table
ich das tun kann
engine.execute(select([table])).fetchall()
und das
connection.execute(select([table])).fetchall()
und sogar das
session.execute(select([table])).fetchall()
- Die Ergebnisse sind gleich.
Soweit ich weiß, wird engine.execute
es erstellt , wenn jemand es verwendet connection
, öffnet session
(Alchemy kümmert sich für Sie darum) und führt die Abfrage aus. Aber gibt es einen globalen Unterschied zwischen diesen drei Arten, eine solche Aufgabe auszuführen?
Antworten:
Eine einzeilige Übersicht:
Das Verhalten
execute()
ist das gleiche in allen Fällen, aber sie sind 3 verschiedene Methoden, inEngine
,Connection
undSession
Klassen.Was genau ist
execute()
:Um das Verhalten von zu verstehen
execute()
, müssen wir in dieExecutable
Klasse schauen .Executable
ist eine Oberklasse für alle "Anweisung" -Objekttypen, einschließlich select (), delete (), update (), insert (), text () - in einfachsten WortenExecutable
ist es ein SQL-Ausdruckskonstrukt, das in SQLAlchemy unterstützt wird.In allen Fällen verwendet die
execute()
Methode den SQL-Text oder den konstruierten SQL-Ausdruck, dh eines der verschiedenen in SQLAlchemy unterstützten SQL-Ausdruckskonstrukte, und gibt Abfrageergebnisse zurück (aResultProxy
- Umschließt einDB-API
Cursorobjekt, um den Zugriff auf Zeilenspalten zu erleichtern.)Zur weiteren Klärung (nur zur konzeptionellen Klärung, kein empfohlener Ansatz) :
Zusätzlich zu
Engine.execute()
(verbindungslose Ausführung),Connection.execute()
undSession.execute()
, ist es auch möglich, dasexecute()
direkt auf jedemExecutable
Konstrukt zu verwenden. DieExecutable
Klasse hat eine eigene Implementierung vonexecute()
- Gemäß der offiziellen Dokumentationexecute()
lautet eine einzeilige Beschreibung " Kompilieren und AusführenExecutable
". In diesem Fall müssen wir dasExecutable
(SQL-Ausdruckskonstrukt) explizit an einConnection
Objekt oder einEngine
Objekt (das implizit einConnection
Objekt erhält ) binden , damit derexecute()
weiß, wo das ausgeführt werden sollSQL
.Das folgende Beispiel zeigt es gut - Gegeben eine Tabelle wie folgt:
Explizite Ausführung, dh
Connection.execute()
Übergabe des SQL-Textes oder des erstellten SQL-Ausdrucks an dieexecute()
MethodeConnection
:Explizite verbindungslose Ausführung, dh
Engine.execute()
Übergabe des SQL-Textes oder des erstellten SQL-Ausdrucks direkt an dieexecute()
Engine-Methode:Die implizite Ausführung, dh
Executable.execute()
- ist ebenfalls verbindungslos und ruft dieexecute()
Methode von aufExecutable
, dh sie ruft dieexecute()
Methode direkt für dasSQL
Ausdruckskonstrukt (eine Instanz vonExecutable
) selbst auf.Hinweis: Das implizite Ausführungsbeispiel wurde zur Verdeutlichung angegeben - diese Art der Ausführung wird dringend empfohlen - gemäß den folgenden Dokumenten :
Deine Fragen:
Sie haben Recht für den Teil "Wenn jemand ihn verwendet
engine.execute
, erstelltconnection
", aber nicht für "Öffnensession
(Alchemy kümmert sich um Sie) und Ausführen der Abfrage" - VerwendenEngine.execute()
undConnection.execute()
ist (fast) dasselbe, formal wird dasConnection
Objekt implizit erstellt und im späteren Fall instanziieren wir es explizit. Was in diesem Fall wirklich passiert, ist:Auf der DB-Ebene ist es genau dasselbe, alle führen SQL aus (Textausdruck oder verschiedene SQL-Ausdruckskonstrukte). Aus Sicht der Anwendung gibt es zwei Möglichkeiten:
Engine.execute()
oderConnection.execute()
sessions
- effizient behandelt Transaktion als einzelne Einheit-of-Arbeit, mit Leichtigkeit übersession.add()
,session.rollback()
,session.commit()
,session.close()
. Dies ist die Möglichkeit, bei ORM, dh zugeordneten Tabellen, mit der Datenbank zu interagieren. Bietet identity_map für den sofortigen Zugriff auf bereits aufgerufene oder neu erstellte / hinzugefügte Objekte während einer einzelnen Anforderung.Session.execute()
Verwendet letztendlich dieConnection.execute()
Anweisungsausführungsmethode, um die SQL-Anweisung auszuführen. Die Verwendung vonSession
Objekten ist die von SQLAlchemy ORM empfohlene Methode für die Interaktion einer Anwendung mit der Datenbank.Ein Auszug aus den Dokumenten :
quelle
Nabeels Antwort umfasst viele Details und ist hilfreich, aber ich fand es verwirrend, zu folgen. Da dies derzeit das erste Google-Ergebnis für dieses Problem ist, füge ich mein Verständnis für zukünftige Personen hinzu, die diese Frage finden:
Ausführen von .execute ()
Wie OP und Nabell Ahmed beide bemerken, gibt es bei der Ausführung einer Ebene
SELECT * FROM tablename
keinen Unterschied im bereitgestellten Ergebnis.Die Unterschiede zwischen diesen drei Objekten wichtig würden je nach Kontext , dass die
SELECT
Aussage in oder, allgemein mehr verwendet wird, wenn Sie andere Dinge tun wollenINSERT
,DELETE
usw.Wann wird Engine, Connection, Session allgemein verwendet?
Engine ist das von SQLAlchemy verwendete Objekt der untersten Ebene. Es verwaltet einen Pool von Verbindungen, die zur Verwendung verfügbar sind, wenn die Anwendung mit der Datenbank kommunizieren muss.
.execute()
ist eine bequeme Methode, die zuerstconn = engine.connect(close_with_result=True)
und dann aufruftconn.execute()
. Der Parameter close_with_result bedeutet, dass die Verbindung automatisch geschlossen wird. (Ich paraphrasiere den Quellcode leicht, aber im Wesentlichen wahr). edit: Hier ist der Quellcode für engine.executeSie können die Engine verwenden, um Raw-SQL auszuführen.
Dies wird in den Dokumenten unter Grundlegende Verwendung behandelt .
Die Verbindung ist (wie wir oben gesehen haben) die Sache, die tatsächlich die Arbeit der Ausführung einer SQL-Abfrage erledigt. Sie sollten dies tun, wenn Sie eine bessere Kontrolle über die Attribute der Verbindung wünschen, wenn diese geschlossen wird usw. Ein sehr wichtiges Beispiel hierfür ist beispielsweise eine Transaktion , mit der Sie entscheiden können, wann Ihre Änderungen in die Datenbank übernommen werden sollen. Bei normaler Verwendung werden Änderungen automatisch festgeschrieben. Mit der Verwendung von Transaktionen können Sie (zum Beispiel) mehrere verschiedene SQL-Anweisungen ausführen. Wenn bei einer dieser Anweisungen ein Fehler auftritt, können Sie alle Änderungen gleichzeitig rückgängig machen.
Auf diese Weise können Sie beide Änderungen rückgängig machen, wenn eine fehlschlägt, z. B. wenn Sie vergessen haben, die Datenprotokolltabelle zu erstellen.
Wenn Sie also SQL-Rohcode ausführen und Kontrolle benötigen, verwenden Sie Verbindungen
Sitzungen werden für den ORM-Aspekt (Object Relationship Management) von SQLAlchemy verwendet (tatsächlich können Sie dies daran erkennen, wie sie importiert werden :)
from sqlalchemy.orm import sessionmaker
. Sie verwenden Verbindungen und Transaktionen unter der Haube, um ihre automatisch generierten SQL-Anweisungen auszuführen..execute()
ist eine Komfortfunktion, die an alles weitergegeben wird, an das die Sitzung gebunden ist (normalerweise eine Engine, kann aber eine Verbindung sein).Wenn Sie die ORM-Funktionalität verwenden, verwenden Sie session. Wenn Sie nur reine SQL-Abfragen ausführen, die nicht an Objekte gebunden sind, ist es wahrscheinlich besser, Verbindungen direkt zu verwenden.
quelle
""
?my_session.connection()
. Docs: docs.sqlalchemy.org/en/13/orm/… .Hier ist ein Beispiel für die Ausführung von DCL (Data Control Language) wie GRANT
quelle