J'utiliser SQLAlchemy et il y a au moins trois entités: engine
, session
et connection
qui ont la execute
méthode, donc si je veux par exemple sélectionner tous les enregistrements de table
je peux le faire
engine.execute(select([table])).fetchall()
et ça
connection.execute(select([table])).fetchall()
et même ça
session.execute(select([table])).fetchall()
- les résultats seront les mêmes.
Si je comprends bien, si quelqu'un l'utilise engine.execute
crée connection
, ouvre session
(Alchemy s'en charge pour vous) et exécute la requête. Mais y a-t-il une différence globale entre ces trois façons d'accomplir une telle tâche?
Réponses:
Un aperçu en une ligne:
Le comportement de
execute()
est la même dans tous les cas, mais ils sont 3 méthodes différentes, dansEngine
,Connection
et lesSession
classes.Qu'est-ce que c'est exactement
execute()
:Pour comprendre le comportement de
execute()
nous devons nous pencher sur laExecutable
classe.Executable
est une superclasse pour tous les types d'objets «instruction», y compris select (), delete (), update (), insert (), text () - en termes simples, uneExecutable
est une construction d'expression SQL prise en charge dans SQLAlchemy.Dans tous les cas, la
execute()
méthode prend le texte SQL ou l'expression SQL construite, c'est-à-dire l'une des différentes constructions d'expression SQL prises en charge dans SQLAlchemy et renvoie les résultats de la requête (aResultProxy
- Enveloppe unDB-API
objet curseur pour faciliter l'accès aux colonnes de ligne.)Pour le clarifier davantage (uniquement à des fins de clarification conceptuelle, pas une approche recommandée) :
En plus de
Engine.execute()
(exécution sans connexion),Connection.execute()
etSession.execute()
, il est également possible d'utiliserexecute()
directement sur n'importe quelleExecutable
construction. LaExecutable
classe a sa propre implémentation deexecute()
- Selon la documentation officielle, une ligne de description de ce queexecute()
fait est " Compiler et exécuter ceciExecutable
". Dans ce cas, nous devons lier explicitement laExecutable
(construction d'expression SQL) avec unConnection
objet ou unEngine
objet (qui obtient implicitement unConnection
objet), de sorte que leexecute()
saura où exécuter leSQL
.L'exemple suivant le montre bien - Compte tenu d'un tableau comme ci-dessous:
Exécution explicite, c'est-à
Connection.execute()
- dire en passant le texte SQL ou l'expression SQL construite à laexecute()
méthode deConnection
:Exécution explicite sans connexion, c'est-à
Engine.execute()
- dire en passant le texte SQL ou l'expression SQL construite directement à laexecute()
méthode du moteur:L'exécution implicite ie
Executable.execute()
- est également sans connexion, et appelle laexecute()
méthode duExecutable
, c'est-à-dire qu'elle appelle laexecute()
méthode directement sur laSQL
construction d'expression (une instance deExecutable
) elle-même.Remarque: a indiqué l'exemple d'exécution implicite à des fins de clarification - cette méthode d'exécution n'est pas recommandée - comme indiqué dans la documentation :
Vos questions:
Vous avez raison pour la partie "si quelqu'un l'utilise
engine.execute
créeconnection
" mais pas pour "ouvresession
(Alchemy s'en soucie pour vous) et exécute la requête" - En utilisantEngine.execute()
etConnection.execute()
est (presque) la même chose, en formel, l'Connection
objet est créé implicitement , et dans un cas ultérieur, nous l'instancions explicitement. Ce qui se passe réellement dans ce cas est:Au niveau de la couche DB, c'est exactement la même chose, tous exécutent du SQL (expression de texte ou diverses constructions d'expression SQL). Du point de vue de l'application, il existe deux options:
Engine.execute()
ouConnection.execute()
sessions
- gère efficacement transaction comme simple unité de travail, avec facilité viasession.add()
,session.rollback()
,session.commit()
,session.close()
. C'est le moyen d'interagir avec la base de données en cas d'ORM, c'est-à-dire de tables mappées. Fournit identity_map pour obtenir instantanément des objets déjà accédés ou nouvellement créés / ajoutés au cours d'une seule demande.Session.execute()
utilise finalement laConnection.execute()
méthode d'exécution de l'instruction afin d'exécuter l'instruction SQL. L'utilisation d'Session
objet est le moyen recommandé par SQLAlchemy ORM pour une application d'interagir avec la base de données.Un extrait de la documentation :
la source
La réponse de Nabeel couvre beaucoup de détails et est utile, mais j'ai trouvé cela déroutant à suivre. Comme il s'agit actuellement du premier résultat Google pour ce problème, j'ajoute ma compréhension de celui-ci pour les futures personnes qui trouveront cette question:
Exécuter .execute ()
Comme le notent OP et Nabell Ahmed, lors de l'exécution d'un plaine
SELECT * FROM tablename
, il n'y a aucune différence dans le résultat fourni.Les différences entre ces trois objets ne deviennent importants en fonction du contexte que la
SELECT
déclaration est utilisée ou, plus souvent, lorsque vous voulez faire d' autres choses commeINSERT
,DELETE
, etc.Quand utiliser Engine, Connection, Session en général
Engine est l'objet de niveau le plus bas utilisé par SQLAlchemy. Il maintient un pool de connexions disponibles chaque fois que l'application a besoin de parler à la base de données.
.execute()
est une méthode pratique qui appelle d'abordconn = engine.connect(close_with_result=True)
et ensuiteconn.execute()
. Le paramètre close_with_result signifie que la connexion est fermée automatiquement. (Je paraphrase légèrement le code source, mais essentiellement vrai). edit: voici le code source de engine.executeVous pouvez utiliser le moteur pour exécuter du SQL brut.
Ceci est couvert dans la documentation sous l'utilisation de base .
La connexion est (comme nous l'avons vu ci-dessus) la chose qui effectue réellement le travail d'exécution d'une requête SQL. Vous devriez le faire chaque fois que vous voulez un meilleur contrôle sur les attributs de la connexion, quand elle est fermée, etc. Par exemple, un exemple très important de ceci est une Transaction , qui vous permet de décider quand valider vos modifications dans la base de données. En utilisation normale, les modifications sont automatiquement validées. Avec l'utilisation de transactions, vous pouvez (par exemple) exécuter plusieurs instructions SQL différentes et si quelque chose ne va pas avec l'une d'entre elles, vous pouvez annuler toutes les modifications en même temps.
Cela vous permettrait d'annuler les deux modifications en cas d'échec, comme si vous aviez oublié de créer la table d'enregistrement des données.
Donc, si vous exécutez du code SQL brut et que vous avez besoin de contrôle, utilisez des connexions
Les sessions sont utilisées pour l'aspect Object Relationship Management (ORM) de SQLAlchemy (en fait, vous pouvez le voir à partir de la façon dont elles sont importées :)
from sqlalchemy.orm import sessionmaker
. Ils utilisent des connexions et des transactions sous le capot pour exécuter leurs instructions SQL générées automatiquement..execute()
est une fonction pratique qui passe par tout ce à quoi la session est liée (généralement un moteur, mais peut être une connexion).Si vous utilisez la fonctionnalité ORM, utilisez session; si vous ne faites que des requêtes SQL simples non liées à des objets, il vaut probablement mieux utiliser directement les connexions.
la source
""
?my_session.connection()
. Documents: docs.sqlalchemy.org/en/13/orm/… .Voici un exemple d'exécution de DCL (Data Control Language) tel que GRANT
la source