Как закрыть сеанс SQLAlchemy?
После того, что мы прокомментировали в Как закрыть соединение sqlalchemy в MySQL, я проверяю соединения, которые SQLAlchemy создает в моей базе данных, и я не могу их закрыть, не выходя из из Python.
Если я запустил этот код в консоли python, он будет закрывать сессию, пока я не выйду из 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()
и единственным обходным решением, которое я нашел, чтобы закрыть его, является вызов engine.dispose()
в конце.
В соответствии с комментариями в ссылке, приведенной выше, мой вопрос:
- Почему
engine.dispose()
необходимо закрыть сеансы?
- Достаточно ли
session.close()
?
Ответы
Ответ 1
Там есть центральное замешательство над словом "сеанс". Я не уверен здесь, но похоже, что вы можете смущать SQLAlchemy Session с MySQL @@session, который относится к области, когда вы впервые подключаетесь к MySQL и когда вы отключитесь.
Эти два понятия не одинаковы. Сессия SQLAlchemy обычно представляет собой область одной или нескольких транзакций при определенном подключении к базе данных.
Таким образом, ответ на ваш вопрос в буквальном смысле слова - это вызов session.close()
, то есть "как правильно закрыть сеанс SQLAlchemy".
Однако остальная часть вашего вопроса указывает, что вам нужна некоторая функциональность, когда закрывается конкретный Session
, вы также должны закрыть фактическое соединение DBAPI.
В основном это означает, что вы хотите отключить пул соединений . Что, как упоминают другие ответы, достаточно просто, использовать NullPool.
Ответ 2
session.close()
предоставит соединение обратно в пул соединений Engine и не закроет соединение.
engine.dispose()
закроет все соединения пула соединений.
Двигатель не будет использовать пул соединений, если вы установите poolclass=NullPool
. Таким образом, соединение (сеанс SQLAlchemy) будет закрываться непосредственно после session.close()
.