Voici comment écrire ce code correctement :
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()
Autrement dit, le Engine
est une usine pour les connexions ainsi qu'un pool de connexions, pas la connexion elle-même. Lorsque vous dites conn.close()
, la connexion est renvoyée au pool de connexions dans le moteur , pas réellement fermé.
Si vous voulez que la connexion soit réellement fermée, c'est-à-dire non regroupée, désactivez la mise en commun via NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
Avec le Engine
ci-dessus configuration, chaque appel à conn.close()
fermera la connexion DBAPI sous-jacente.
Si OTOH vous voulez réellement vous connecter à différent bases de données à chaque appel, c'est-à-dire votre "localhost/test_database"
codé en dur est juste un exemple et vous avez en fait beaucoup de bases de données différentes, alors l'approche utilisant dispose()
c'est bien; il fermera toutes les connexions qui ne sont pas extraites du pool.
Dans tous les cas ci-dessus, l'important est que la Connection
l'objet est fermé via close()
. Si vous utilisez n'importe quel type d'exécution "sans connexion", c'est engine.execute()
ou statement.execute()
, le ResultProxy
l'objet renvoyé à partir de cet appel d'exécution doit être entièrement lu, ou sinon explicitement fermé via close()
. Une Connection
ou ResultProxy
qui est encore ouvert interdira le NullPool
ou dispose()
approche de la fermeture de chaque dernière connexion.