Veja como escrever esse código corretamente:
db = create_engine('mysql://example@sqldat.com/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://example@sqldat.com/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.