Sådan skriver du den kode 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 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://example@sqldat.com/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.