Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fechar a conexão sqlalchemy no MySQL


Veja como escrever esse código corretamente:
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()

Ou seja, o Engine é uma fábrica para conexões, bem como um pool de conexões, não a conexão em si. Quando você diz conn.close() , a conexão é retornada ao pool de conexões dentro do Engine , não realmente fechado.

Se você deseja que a conexão seja realmente fechada, ou seja, não agrupada, desative o agrupamento via NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)

Com o Engine acima configuração, cada chamada para conn.close() fechará a conexão DBAPI subjacente.

Se OTOH você realmente deseja se conectar a diferente bancos de dados em cada chamada, ou seja, seu "localhost/test_database" codificado permanentemente é apenas um exemplo e você realmente tem muitos bancos de dados diferentes, então a abordagem usando dispose() está bem; ele fechará todas as conexões que não forem retiradas do pool.

Em todos os casos acima, o importante é que a Connection objeto é fechado via close() . Se você estiver usando qualquer tipo de execução "sem conexão", isso é engine.execute() ou statement.execute() , o ResultProxy objeto retornado dessa chamada de execução deve ser totalmente lido ou, de outra forma, explicitamente fechado via close() . Uma Connection ou ResultProxy que ainda está aberto proibirá o NullPool ou dispose() aproxima de fechar cada última conexão.