Zo schrijft u die code correct:
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()
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://[email protected]/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.