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