web-dev-qa-db-fra.com

Comment fermer une session SQLAlchemy?

Suite à ce que nous avons commenté Comment fermer la connexion sqlalchemy dans MySQL , je vérifie les connexions que SQLAlchemy crée dans ma base de données et je ne peux pas les fermer sans quitter Python.

Si j'exécute ce code dans une console python, il garde la session ouverte jusqu'à ce que je quitte python:

from sqlalchemy.orm import sessionmaker
from models import OneTable, get_engine

engine = get_engine(database="mydb")
session = sessionmaker(bind=engine)()

results = session.query(OneTable.company_name).all()

# some work with the data #

session.close()

et la seule solution de contournement que j'ai trouvée pour le fermer est d'appeler engine.dispose() à la fin.

Selon les commentaires dans le lien que j'ai donné ci-dessus, ma question est maintenant:

  • Pourquoi engine.dispose() est-il nécessaire pour fermer des sessions?
  • session.close() ne suffit-il pas?
52
fedorqui

Il y a ici une confusion centrale autour de la "session" Word. Je ne suis pas sûr ici, mais il semble que vous confondiez le SQLAlchemy Session avec un MySQL @@ session , qui fait référence à la portée de la première fois que vous faites un connexion à MySQL et lorsque vous vous déconnectez.

Ces deux concepts ne sont pas différents . Une session SQLAlchemy représente généralement la portée de une ou plusieurs transactions , sur une connexion de base de données particulière.

Par conséquent, la réponse à votre question telle qu'elle est posée littéralement est d'appeler session.close(), c'est-à-dire "comment fermer correctement une session SQLAlchemy".

Cependant, le reste de votre question indique que vous souhaitez certaines fonctionnalités par lesquelles lorsqu'un Session particulier est fermé, vous souhaitez que la connexion DBAPI réelle soit également fermée.

Cela signifie essentiellement que vous souhaitez désactiver pool de connexions . Comme le mentionnent d'autres réponses, assez facile, tilisez NullPool .

68
zzzeek

session.close() rendra la connexion au pool de connexions du moteur et ne ferme pas la connexion.

engine.dispose() fermera toutes les connexions du pool de connexions.

Le moteur n'utilisera pas le pool de connexions si vous définissez poolclass=NullPool. Ainsi, la connexion (session SQLAlchemy) se fermera directement après session.close().

49
julivico