sql >> Base de Datos >  >> RDS >> Mysql

Cómo cerrar la conexión sqlalchemy en MySQL

He aquí cómo escribir ese código correctamente:

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()

Es decir, el Engine es una fábrica para conexiones así como un grupo de conexiones, no la conexión en sí. Cuando dices conn.close() , la conexión se devuelve al conjunto de conexiones dentro del motor , en realidad no está cerrado.

Si desea que la conexión se cierre realmente, es decir, no se agrupe, deshabilite la agrupación a través de NullPool :

from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)

Con el Engine anterior configuración, cada llamada a conn.close() cerrará la conexión DBAPI subyacente.

Si OTOH realmente desea conectarse a diferente bases de datos en cada llamada, es decir, su "localhost/test_database" codificado es solo un ejemplo y en realidad tiene muchas bases de datos diferentes, luego el enfoque usando dispose() está bien; cerrará todas las conexiones que no estén desprotegidas del grupo.

En todos los casos anteriores, lo importante es que la Connection el objeto se cierra a través de close() . Si está utilizando algún tipo de ejecución "sin conexión", eso es engine.execute() o statement.execute() , el ResultProxy el objeto devuelto de esa llamada de ejecución debe leerse por completo o, de lo contrario, cerrarse explícitamente a través de close() . Una Connection o ResultProxy que todavía está abierto prohibirá el NullPool o dispose() enfoques de cerrar hasta la última conexión.