Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment fermer la connexion sqlalchemy dans MySQL

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.