python - safe - sqlalchemy session execute parameters
¿Cómo cerrar una sesión de SQLAlchemy? (2)
Hay una confusión central aquí sobre la palabra "sesión". No estoy seguro aquí, pero parece que puede confundir la Sesión de SQLAlchemy con una sesión de MySQL @@ , que se refiere al alcance de la primera vez que se conecta a MySQL y cuando se desconecta.
Estos dos conceptos no son lo mismo . Una sesión de SQLAlchemy generalmente representa el alcance de una o más transacciones , sobre una conexión de base de datos particular.
Por lo tanto, la respuesta a su pregunta, como se le preguntó literalmente, es llamar a session.close()
, es decir, "cómo cerrar correctamente una sesión de SQLAlchemy".
Sin embargo, el resto de su pregunta indica que desea alguna funcionalidad mediante la cual, cuando se cierre una Session
particular, también desee que se cierre la conexión DBAPI real.
Lo que esto básicamente significa es que desea deshabilitar la agrupación de conexiones . Que como otras respuestas mencionan, es bastante fácil, usar NullPool .
Siguiendo lo que comentamos en Cómo cerrar la conexión de sqlalchemy en MySQL , estoy verificando 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 alternativa que encontré para cerrarla es llamar a engine.dispose()
al final.
De acuerdo con los comentarios en el enlace que di más arriba, mi pregunta ahora es:
- ¿Por qué es necesario
engine.dispose()
para cerrar sesiones? - ¿No es suficiente con
session.close()
?
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.
Engine no usará el grupo de conexiones si establece poolclass=NullPool
. Entonces, la conexión (SQLAlchemy session) se cerrará directamente después de session.close()
.