Oto jak poprawnie napisać ten kod:
db = create_engine('mysql://[email protected]/test_database')
for i in range(1,2000):
conn = db.connect()
#some simple data operations
conn.close()
db.dispose()
Oznacza to, że Engine
jest fabryką na połączenia oraz pulę połączeń, a nie samo połączenie. Kiedy mówisz conn.close()
, połączenie jest zwracane do puli połączeń w silniku , a właściwie nie zamknięte.
Jeśli chcesz, aby połączenie było rzeczywiście zamknięte, to znaczy nie było buforowane, wyłącz buforowanie przez NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
Z powyższym Engine
konfiguracja, każde wywołanie conn.close()
zamknie podstawowe połączenie DBAPI.
Jeśli OTOH rzeczywiście chcesz połączyć się z innymi bazy danych przy każdym wywołaniu, czyli zakodowana na stałe "localhost/test_database"
to tylko przykład, a tak naprawdę masz wiele różnych baz danych, to podejście wykorzystujące dispose()
jest w porządku; zamknie każde połączenie, które nie zostało pobrane z puli.
We wszystkich powyższych przypadkach ważne jest, aby Connection
obiekt jest zamykany przez close()
. Jeśli używasz dowolnego rodzaju wykonywania „bezpołączeniowego”, czyli engine.execute()
lub statement.execute()
, ResultProxy
obiekt zwrócony z tego wywołania wykonania powinien być w pełni odczytany lub w inny sposób jawnie zamknięty przez close()
. Connection
lub ResultProxy
który jest nadal otwarty, zabroni NullPool
lub dispose()
zbliża się od zamknięcia każdego ostatniego połączenia.