Подтвердить что ты не робот

Как закрыть сеанс 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()?
4b9b3361

Ответ 1

Там есть центральное замешательство над словом "сеанс". Я не уверен здесь, но похоже, что вы можете смущать SQLAlchemy Session с MySQL @@session, который относится к области, когда вы впервые подключаетесь к MySQL и когда вы отключитесь.

Эти два понятия не одинаковы. Сессия SQLAlchemy обычно представляет собой область одной или нескольких транзакций при определенном подключении к базе данных.

Таким образом, ответ на ваш вопрос в буквальном смысле слова - это вызов session.close(), то есть "как правильно закрыть сеанс SQLAlchemy".

Однако остальная часть вашего вопроса указывает, что вам нужна некоторая функциональность, когда закрывается конкретный Session, вы также должны закрыть фактическое соединение DBAPI.

В основном это означает, что вы хотите отключить пул соединений . Что, как упоминают другие ответы, достаточно просто, использовать NullPool.

Ответ 2

session.close() предоставит соединение обратно в пул соединений Engine и не закроет соединение.

engine.dispose() закроет все соединения пула соединений.

Двигатель не будет использовать пул соединений, если вы установите poolclass=NullPool. Таким образом, соединение (сеанс SQLAlchemy) будет закрываться непосредственно после session.close().