Så här skriver du den koden korrekt:
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()
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://[email protected]/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.