Berikut cara menulis kode tersebut dengan benar:
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()
Yaitu, Engine adalah pabrik untuk koneksi serta kolam koneksi, bukan koneksi itu sendiri. Saat Anda mengucapkan conn.close() , koneksi dikembalikan ke kumpulan koneksi di dalam Engine , sebenarnya tidak ditutup.
Jika Anda ingin koneksi benar-benar ditutup, yaitu, tidak digabungkan, nonaktifkan penggabungan melalui NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
Dengan Engine di atas konfigurasi, setiap panggilan ke conn.close() akan menutup koneksi DBAPI yang mendasarinya.
Jika OTOH Anda benar-benar ingin terhubung ke berbeda database pada setiap panggilan, yaitu "localhost/test_database" hardcode Anda hanyalah sebuah contoh dan Anda sebenarnya memiliki banyak database yang berbeda, maka pendekatannya menggunakan dispose() baik-baik saja; itu akan menutup setiap koneksi yang tidak diperiksa dari kumpulan.
Dalam semua kasus di atas, yang penting adalah Connection objek ditutup melalui close() . Jika Anda menggunakan jenis eksekusi "tanpa koneksi", yaitu engine.execute() atau statement.execute() , ResultProxy objek yang dikembalikan dari panggilan eksekusi itu harus dibaca sepenuhnya, atau secara eksplisit ditutup melalui close() . Sebuah Connection atau ResultProxy yang masih terbuka akan melarang NullPool atau dispose() mendekat dari menutup setiap koneksi terakhir.