Zde je návod, jak správně napsat tento kód:
db = create_engine('mysql://example@sqldat.com/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://example@sqldat.com/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í.