Saya benar-benar baru untuk modul sqlite3 Python (dan SQL secara umum dalam hal ini), dan ini benar-benar membuat saya bingung. Kurangnya deskripsi cursor
objek yang melimpah (lebih karena kebutuhannya) juga tampak aneh.
Potongan kode ini adalah cara yang disukai untuk melakukan sesuatu:
import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()
Yang ini tidak, meskipun bekerja dengan baik dan tanpa (tampaknya tidak ada gunanya) cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
Adakah yang bisa memberi tahu saya mengapa saya perlu cursor
?
Sepertinya overhead yang tidak ada gunanya. Untuk setiap metode dalam skrip saya yang mengakses database, saya seharusnya membuat dan menghancurkan cursor
?
Mengapa tidak menggunakan connection
objek saja?
Anda memerlukan objek kursor untuk mengambil hasil. Contoh Anda berfungsi karena ini adalah
INSERT
dan dengan demikian Anda tidak mencoba mendapatkan baris apa pun darinya, tetapi jika Anda melihatsqlite3
dokumen , Anda akan melihat bahwa tidak ada.fetchXXXX
metode pada objek koneksi, jadi jika Anda mencoba melakukannya aSELECT
tanpa kursor, Anda tidak akan memiliki cara untuk mendapatkan data yang dihasilkan.Objek kursor memungkinkan Anda untuk melacak set hasil yang mana, karena dimungkinkan untuk menjalankan beberapa kueri sebelum Anda selesai mengambil hasil yang pertama.
sumber
execute
pada objek koneksi, ini adalahsqlite3
ekstensi.Menurut dokumen resmi
connection.execute()
adalah pintasan tidak standar yang membuat objek kursor menengah:sumber
( dokumentasi sqlite3 ; penekanan milikku.)
Karena metode-metode dari objek koneksi tidak standar , yaitu mereka bukan bagian dari Spesifikasi API Python Database v2.0 (PEP 249).
Selama Anda menggunakan metode standar objek Cursor, Anda dapat yakin bahwa jika Anda beralih ke implementasi database lain yang mengikuti spesifikasi di atas, kode Anda akan sepenuhnya portabel. Mungkin Anda hanya perlu mengubah
import
jalurnya.Tetapi jika Anda menggunakan
connection.execute
ada kemungkinan bahwa peralihan tidak akan semudah itu. Itulah alasan utama Anda mungkin ingin menggunakannyacursor.execute
.Namun jika Anda yakin bahwa Anda tidak akan beralih, saya akan mengatakan tidak apa-apa untuk mengambil jalan
connection.execute
pintas dan menjadi "efisien".sumber
Ini memberi kita kemampuan untuk memiliki beberapa lingkungan kerja yang terpisah melalui koneksi yang sama ke database.
sumber