Ketika saya melakukan engine=create_engine(...) dan kemudian engine.execute(SQL) apakah SQLAlchemy mengelola penutupan koneksi/kursor dengan pernyataan eksekusi atau apakah itu sesuatu yang perlu saya lakukan sendiri?

Saya telah melihat execute metode tetapi tidak jelas bagi saya.

0
samuelbrody1249 20 November 2020, 03:37

1 menjawab

Jawaban Terbaik

Pertama-tama, dari bit kode yang Anda tampilkan, Anda melihat dokumentasi yang salah untuk dieksekusi. Dokumen yang tepat untuk mengeksekusi dari apa yang Anda tunjukkan sebagai kode Anda adalah sebagai berikut: engine.execute. Di sini dikatakan

ResultProxy yang dikembalikan ditandai sedemikian rupa sehingga ketika ResultProxy habis dan kursor dasarnya ditutup, Koneksi yang dibuat di sini juga akan ditutup, yang memungkinkan sumber koneksi DBAPI yang terkait dikembalikan ke kumpulan koneksi.

Anda menggunakan eksekusi tanpa koneksi

Dan Anda dapat melihat contoh yang disajikan di sana:

engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
    # ....
result.close()

Jadi variabel result adalah ResultProxy dan Anda dapat melihatnya dalam contoh yang ditutup secara eksplisit. Dokumentasi ResultProxy.close() memberi tahu persis apa yang ditutup, dan kasing Anda tampaknya termasuk dalam eksekusi tanpa koneksi sehingga setelah ditutup, koneksi juga akan ditutup. Bagian-bagian dari dokumen ini pada penutupan sangat penting:

Ini menutup kursor DBAPI yang mendasari terkait dengan eksekusi pernyataan, jika masih ada. Perhatikan bahwa kursor DBAPI dilepaskan secara otomatis ketika ResultProxy menghabiskan semua baris yang tersedia. ResultProxy.close() umumnya merupakan metode opsional kecuali dalam kasus ketika membuang ResultProxy yang masih memiliki baris tambahan yang menunggu untuk diambil. Dalam kasus hasil yang merupakan produk dari eksekusi tanpa koneksi, objek Koneksi yang mendasarinya juga ditutup, yang melepaskan sumber koneksi DBAPI.

Saya sarankan untuk juga membaca dengan seksama catatan tentang perubahan pada versi 1.0.0:

Berubah di versi 1.0.0: - metode ResultProxy.close() telah dipisahkan dari proses yang melepaskan sumber kursor DBAPI yang mendasarinya. Fitur "tutup otomatis" dari Koneksi sekarang melakukan apa yang disebut "tutup lunak", yang melepaskan kursor DBAPI yang mendasarinya, tetapi memungkinkan ResultProxy untuk tetap berperilaku sebagai rangkaian hasil terbuka-tetapi-habis; metode ResultProxy.close() yang sebenarnya tidak pernah dipanggil. Masih aman untuk membuang ResultProxy yang telah habis sepenuhnya tanpa memanggil metode ini.

Saya pikir sekarang Anda harus memiliki semua materi dan memutuskan apa yang sesuai dengan kasus Anda. Secara pribadi, bahkan jika dikatakan tutup adalah opsional dalam banyak kasus kecuali kasus yang disebutkan, saya akan menggunakannya.

1
fedepad 20 November 2020, 01:31