¿Cómo cerrar una sesión de SQLAlchemy?

Siguiendo lo que comentamos en Cómo cerrar la conexión sqlalchemy en MySQL , estoy comprobando las conexiones que SQLAlchemy crea en mi base de datos y no puedo cerrarlas sin salir de Python.

Si ejecuto este código en una consola de python, mantiene la sesión abierta hasta que salga de 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() 

y la única solución que encontré para cerrarla es llamar a engine.dispose() al final.

Según los comentarios en el enlace que di arriba, mi pregunta es ahora:

  • ¿Por qué es necesario engine.dispose() para cerrar sesiones?
  • ¿No es suficiente session.close() ?

Hay una confusión central aquí sobre la palabra “sesión”. No estoy seguro aquí, pero parece que puede estar confundiendo la SQLAlchemy Session con una sesión de MySQL @@ , que se refiere al scope de la primera vez que realiza una conexión a MySQL y cuando se desconecta.

Estos dos conceptos no son los mismos . Una sesión de SQLAlchemy generalmente representa el scope de una o más transacciones , en una conexión de base de datos particular.

Por lo tanto, la respuesta a su pregunta, tal como se hizo literalmente, es llamar a session.close() , es decir, “cómo cerrar correctamente una sesión de SQLAlchemy”.

Sin embargo, el rest de su pregunta indica que le gustaría alguna funcionalidad por la cual, cuando se cierra una Session particular, le gustaría que la conexión DBAPI real también se cierre.

Lo que esto significa básicamente es que desea deshabilitar la agrupación de conexiones . Que como otras respuestas mencionan, lo suficientemente fácil, use NullPool .

session.close() devolverá la conexión al grupo de conexiones de Engine y no cerrará la conexión.

engine.dispose() cerrará todas las conexiones del grupo de conexiones.

El motor no utilizará el conjunto de conexiones si establece poolclass=NullPool . Así que la conexión (sesión de SQLAlchemy) se cerrará directamente después de session.close() .