mysql - conectar - sqlalchemy sql server
Cómo cerrar la conexión sqlalchemy en MySQL (2)
Aquí es cómo escribir ese código correctamente:
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()
Es decir, el Engine
es una fábrica de conexiones, así como un conjunto de conexiones, no la conexión en sí. Cuando dice conn.close()
, la conexión se devuelve al grupo de conexiones dentro del Motor , no se cierra realmente.
Si desea que la conexión se cierre realmente, es decir, no se NullPool
, desactive la agrupación a través de NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine(''mysql://root@localhost/test_database'', poolclass=NullPool)
Con la configuración del Engine
anterior, cada llamada a conn.close()
cerrará la conexión DBAPI subyacente.
Si OTOH realmente desea conectarse a diferentes bases de datos en cada llamada, es decir, su "localhost/test_database"
es solo un ejemplo y en realidad tiene muchas bases de datos diferentes, entonces el enfoque que utiliza dispose()
está bien; cerrará todas las conexiones que no se hayan retirado del grupo.
En todos los casos anteriores, lo importante es que el objeto Connection
se cierra a través de close()
. Si está utilizando cualquier tipo de ejecución "sin conexión", es decir, engine.execute()
o statement.execute()
, el objeto ResultProxy
devuelto de esa llamada de ejecución debe leerse por completo o, de lo contrario, cerrarse explícitamente mediante close()
. Una Connection
o ResultProxy
que aún esté abierta prohibirá que NullPool
o dispose()
acerque a cerrar todas las conexiones.
Este es un código de ejemplo que me gustaría ejecutar:
for i in range(1,2000):
db = create_engine(''mysql://root@localhost/test_database'')
conn = db.connect()
#some simple data operations
conn.close()
db.dispose()
¿Hay alguna forma de ejecutar esto sin obtener errores de "Demasiadas conexiones" de MySQL? Ya sé que puedo manejar la conexión de otra manera o tener un grupo de conexiones. Solo me gustaría entender cómo cerrar correctamente una conexión desde sqlalchemy. ¡Gracias por adelantado!
Intenté encontrar una solución para desconectarse de la base de datos por un problema no relacionado (debe desconectarse antes de forking).
También debe invalidate la conexión del grupo de conexiones.
En tu ejemplo:
for i in range(1,2000):
db = create_engine(''mysql://root@localhost/test_database'')
conn = db.connect()
# some simple data operations
# session.close() if needed
conn.invalidate()
db.dispose()