Sådan skriver du den kode 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 vil sige Engine
er en fabrik til forbindelser samt en pulje af forbindelser, ikke selve forbindelsen. Når du siger conn.close()
, returneres forbindelsen til forbindelsespuljen i motoren , faktisk ikke lukket.
Hvis du ønsker, at forbindelsen rent faktisk skal lukkes, dvs. ikke samles, skal du deaktivere pooling via NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
Med ovenstående Engine
konfiguration, hvert kald til conn.close()
vil lukke den underliggende DBAPI-forbindelse.
Hvis OTOH du faktisk ønsker at oprette forbindelse til andre databaser på hvert opkald, det vil sige din hårdkodede "localhost/test_database"
er bare et eksempel, og du har faktisk mange forskellige databaser, så er fremgangsmåden ved hjælp af dispose()
er fint; det vil lukke alle forbindelser, der ikke er tjekket ud fra poolen.
I alle ovenstående tilfælde er det vigtige, at Connection
objekt lukkes via close()
. Hvis du bruger nogen form for "forbindelsesfri" udførelse, det er engine.execute()
eller statement.execute()
, ResultProxy
objekt, der returneres fra det eksekveringskald, skal læses fuldt ud eller på anden måde eksplicit lukkes via close()
. En Connection
eller ResultProxy
som stadig er åben vil forbyde NullPool
eller dispose()
nærmer sig fra at lukke hver sidste forbindelse.