Comment fermer une session SQLAlchemy?

Suivant ce que nous avons commenté dans Comment fermer la connexion sqlalchemy dans MySQL , je vérifie les connexions que SQLAlchemy crée dans ma firebase database et je n’arrive pas à les fermer sans quitter Python.

Si je lance ce code dans une console Python, la session rest 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 la 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() nécessaire pour fermer des sessions?
  • Est-ce que session.close() suffit pas?

Il y a une confusion centrale ici sur le mot “session”. Je ne suis pas sûr ici, mais il semble que vous puissiez confondre la session SQLAlchemy avec une session MySQL @@ , qui fait référence à la scope de la première connexion à MySQL et à la déconnexion.

Ces deux concepts ne sont pas les mêmes . Une session SQLAlchemy représente généralement la scope d’ une ou plusieurs transactions , sur une connexion de firebase database particulière.

Par conséquent, la réponse à votre question, littéralement posée, est d’appeler session.close() , c’est-à-dire “comment fermer correctement une session SQLAlchemy”.

Cependant, le rest de votre question indique que vous souhaitez une fonctionnalité permettant, lorsqu’une Session particulière est fermée, de fermer également la connexion DBAPI.

En gros, cela signifie que vous souhaitez désactiver le regroupement de connexions . Ce que d’autres réponses mentionnent, assez facile, utilisez NullPool .

session.close() redonne la connexion au pool de connexions de Engine 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 . La connexion (session SQLAlchemy) se fermera donc directement après session.close() .