Zde je návod, jak správně napsat tento kód:
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()
Tedy Engine
je továrna pro připojení a také pool spojení, nikoli spojení samotné. Když řeknete conn.close()
, připojení se vrátí do fondu připojení v rámci modulu , ve skutečnosti není uzavřen.
Pokud chcete, aby bylo připojení skutečně uzavřeno, to znamená, že nebylo sdruženo, zakažte sdružování pomocí NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
S výše uvedeným Engine
konfigurace, každé volání conn.close()
zavře základní připojení DBAPI.
Pokud se OTOH skutečně chcete připojit k jinému databáze při každém volání, tedy vaše pevně zakódované "localhost/test_database"
je jen příklad a ve skutečnosti máte spoustu různých databází, pak přístup pomocí dispose()
je v pořádku; uzavře každé připojení, které není odhlášeno z fondu.
Ve všech výše uvedených případech je důležité, že Connection
objekt je uzavřen pomocí close()
. Pokud používáte jakýkoli druh spouštění „bez připojení“, je to engine.execute()
nebo statement.execute()
, ResultProxy
objekt vrácený z tohoto volání spuštění by měl být plně přečten nebo jinak explicitně uzavřen pomocí close()
. Connection
nebo ResultProxy
který je stále otevřený, zakáže NullPool
nebo dispose()
přístupy od uzavření každého posledního spojení.