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.