Voici comment écrire ce code correctement :
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()
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://example@sqldat.com/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.