Zo schrijft u die code correct:
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()
Dat wil zeggen, de Engine is een fabriek voor verbindingen en een pool van verbindingen, niet de verbinding zelf. Als je conn.close() . zegt , wordt de verbinding teruggestuurd naar de verbindingspool binnen de Engine , niet echt gesloten.
Als u wilt dat de verbinding daadwerkelijk wordt gesloten, dat wil zeggen niet gepoold, schakelt u pooling uit via NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
Met de bovenstaande Engine configuratie, elke aanroep naar conn.close() sluit de onderliggende DBAPI-verbinding.
Als OTOH u daadwerkelijk verbinding wilt maken met andere databases bij elke aanroep, dat wil zeggen uw hardgecodeerde "localhost/test_database" is slechts een voorbeeld en je hebt eigenlijk veel verschillende databases, dan is de aanpak met dispose() is goed; het zal elke verbinding sluiten die niet is uitgecheckt bij de pool.
In alle bovenstaande gevallen is het belangrijkste dat de Connection object wordt gesloten via close() . Als u een "verbindingsloze" uitvoering gebruikt, is dat engine.execute() of statement.execute() , de ResultProxy object dat wordt geretourneerd door die uitvoeraanroep moet volledig worden gelezen, of anderszins expliciet worden gesloten via close() . Een Connection of ResultProxy die nog open is, verbiedt de NullPool of dispose() nadert van het sluiten van elke laatste verbinding.