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

721   2  

2 ответов:

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

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

Поэтому ответ на ваш вопрос, как буквально заданный, заключается в вызове session.close(), то есть "как правильно закрыть сеанс SQLAlchemy".

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

Это в основном означает, что вы хотите отключитьобъединение соединений . Которые, как упоминают другие ответы, достаточно легко, использовать Нуллпул .

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

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

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

Comments

    Ничего не найдено.