Ето как да напишете този код правилно:
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()
Тоест Engine е фабрика за връзки, както и басейн на връзките, а не на самата връзка. Когато кажете conn.close() , връзката се връща към пула от връзки в Engine , всъщност не е затворено.
Ако искате връзката действително да бъде затворена, тоест да не бъде обединена, деактивирайте обединяването чрез NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
С горния Engine конфигурация, всяко извикване на conn.close() ще затвори основната DBAPI връзка.
Ако OTOH всъщност искате да се свържете с различни бази данни при всяко повикване, тоест вашия твърдо кодиран "localhost/test_database" е само пример и всъщност имате много различни бази данни, а след това подходът, използващ dispose() е наред; ще затвори всяка връзка, която не е изтеглена от пула.
Във всички горепосочени случаи важното е, че Connection обектът се затваря чрез close() . Ако използвате някакъв вид изпълнение без връзка, това е engine.execute() или statement.execute() , ResultProxy обектът, върнат от това извикване на изпълнение, трябва да бъде напълно прочетен или по друг начин изрично затворен чрез close() . A Connection или ResultProxy който все още е отворен, ще забрани NullPool или dispose() подходи от затваряне на всяка последна връзка.