Ето как да напишете този код правилно:
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()
Тоест Engine
е фабрика за връзки, както и басейн на връзките, а не на самата връзка. Когато кажете conn.close()
, връзката се връща към пула от връзки в Engine , всъщност не е затворено.
Ако искате връзката действително да бъде затворена, тоест да не бъде обединена, деактивирайте обединяването чрез NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/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()
подходи от затваряне на всяка последна връзка.