Voici comment écrire ce code correctement :
db = create_engine('mysql://root@localhost/test_database')
for i in range(1,2000):
conn = db.connect()
#some simple data operations
conn.close()
db.dispose()
C'est-à-dire que le Engine
es un usine pour les connexions ainsi qu'un piscine des connexions, pas la connexion elle-même. Quand vous dites conn.close()
la connexion est renvoyé au pool de connexion dans le moteur pas vraiment fermé.
Si vous souhaitez que la connexion soit réellement fermée, c'est-à-dire qu'elle ne soit pas mise en commun, désactivez la mise en commun en utilisant la commande NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://root@localhost/test_database', poolclass=NullPool)
Avec ce qui précède Engine
chaque appel à conn.close()
fermera la connexion DBAPI sous-jacente.
Si par contre vous voulez réellement vous connecter à différents à chaque appel, c'est à dire que vos bases de données codées en dur "localhost/test_database"
n'est qu'un exemple et que vous avez en fait beaucoup de bases de données différentes, alors l'approche qui utilise dispose()
est bien ; il fermera toutes les connexions qui ne sont pas extraites du pool.
Dans tous les cas susmentionnés, l'important est que la Connection
est fermé via close()
. Si vous utilisez un type d'exécution "sans connexion", c'est-à-dire engine.execute()
o statement.execute()
le ResultProxy
renvoyé par cet appel d'exécution doit être entièrement lu, ou bien fermé explicitement par l'intermédiaire de la fonction close()
. A Connection
o ResultProxy
qui est encore ouverte, interdira le NullPool
o dispose()
des approches de la fermeture de chaque dernière connexion.