Så här skriver du den koden korrekt:
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()
Det vill säga Engine är en fabrik för anslutningar samt en pool av anslutningar, inte själva anslutningen. När du säger conn.close() , återförs anslutningen till anslutningspoolen i motorn , faktiskt inte stängd.
Om du vill att anslutningen faktiskt ska stängas, det vill säga inte poolas, inaktivera pooling via NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
Med ovanstående Engine konfiguration, varje anrop till conn.close() kommer att stänga den underliggande DBAPI-anslutningen.
Om OTOH du faktiskt vill ansluta till olika databaser för varje samtal, det vill säga din hårdkodade "localhost/test_database" är bara ett exempel och du har faktiskt massor av olika databaser, då metoden med dispose() är bra; det kommer att stänga alla anslutningar som inte har checkats ut från poolen.
I alla ovanstående fall är det viktiga att Connection objekt stängs via close() . Om du använder någon form av "anslutningslös" exekvering, det är engine.execute() eller statement.execute() , ResultProxy objekt som returneras från det exekveringsanropet bör läsas fullständigt eller på annat sätt uttryckligen stängas via close() . En Connection eller ResultProxy som fortfarande är öppen kommer att förbjuda NullPool eller dispose() närmar sig från att stänga alla anslutningar.