Jak zamknąć sesję SQLAlchemy?

Po tym, co skomentowaliśmy w Jak zamknąć połączenie sqlalchemy w MySQL , sprawdzam połączenia, które SQLAlchemy tworzy w mojej bazie danych i nie mogę ich zamknąć bez wyjścia z Pythona.

Jeśli uruchamiam ten kod w konsoli Pythona, utrzymuje on otwartą sesję, dopóki nie wyjdę z Pythona:

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()

I jedynym obejściem, jakie znalazłem, aby go zamknąć, jest wywołanie engine.dispose() na końcu.

Zgodnie z komentarzami w linku podanym powyżej, moje pytanie jest teraz:

  • Dlaczego engine.dispose() jest konieczne, aby zamknąć sesje?
  • czy session.close() nie wystarczy?
Author: Community, 2014-02-13

2 answers

Jest tu Centralne zamieszanie co do słowa "sesja". Nie jestem pewien, ale wygląda na to, że możesz pomylić sesję SQLAlchemyz MySQL @@session, która odnosi się do zakresu, kiedy po raz pierwszy nawiązujesz połączenie z MySQL i kiedy się rozłączysz.

Te dwa pojęcia tonie to samo . Sesje SQLAlchemy zazwyczaj reprezentują zakres jednej lub więcej transakcji , na określonej bazie danych połączenie.

Dlatego odpowiedzią na twoje pytanie, dosłownie zadane, jest wywołanie session.close(), czyli "jak prawidłowo zamknąć sesję SQLAlchemy".

Jednak reszta twojego pytania wskazuje, że chciałbyś mieć jakąś funkcjonalność, dzięki której gdy konkretny Session jest zamknięty, chcesz również zamknąć rzeczywiste połączenie DBAPI.

Oznacza to, że chcesz wyłączyć łączenie połączeń . Które, jak wspominają inne odpowiedzi, łatwo, używać NullPool .

 55
Author: zzzeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-04 07:33:10

session.close() spowoduje przywrócenie połączenia do puli połączeń silnika i nie zamyka połączenia.

engine.dispose() zamknie wszystkie połączenia puli połączeń.

Silnik nie użyje puli połączeń, Jeśli ustawisz poolclass=NullPool. Tak więc połączenie (sesja SQLAlchemy) zostanie zamknięte bezpośrednio po session.close().

 33
Author: julivico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 09:26:23