db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")
Dengan iterasi saya mendapatkan daftar yang sesuai dengan baris.
for row in res:
print row
Saya bisa mendapatkan nama kolom
col_name_list = [tuple[0] for tuple in res.description]
Tetapi apakah ada fungsi atau pengaturan untuk mendapatkan kamus daripada daftar?
{'col1': 'value', 'col2': 'value'}
atau saya harus melakukannya sendiri?
python
sql
sqlite
dictionary
dataformat
Meloun
sumber
sumber
Jawaban:
Anda bisa menggunakan row_factory , seperti pada contoh di dokumen:
atau ikuti saran yang diberikan tepat setelah contoh ini di dokumen:
sumber
SELECT 1 AS "dog[cat]"
makacursor
tidak akan memiliki deskripsi yang benar untuk membuat dict.connection.row_factory = sqlite3.Row
dan saya mencobaconnection.row_factory = dict_factory
seperti yang ditunjukkan tetapicur.fetchall()
masih memberi saya daftar tupel - tahu mengapa ini tidak berfungsi?collections.namedtuple
. Ketika saya menggunakancur.fetchmany()
saya mendapatkan entri seperti<sqlite3.Row object at 0x...>
.Saya pikir saya menjawab pertanyaan ini meskipun jawabannya sebagian disebutkan dalam jawaban Adam Schmideg dan Alex Martelli. Agar orang lain seperti saya yang memiliki pertanyaan yang sama, dapat menemukan jawabannya dengan mudah.
sumber
fetchall()
tampaknya mengembalikansqlite3.Row
objek. Namun ini dapat dikonversi ke kamus hanya dengan menggunakandict()
:result = [dict(row) for row in c.fetchall()]
.Bahkan menggunakan sqlite3.Row class-- Anda masih tidak dapat menggunakan pemformatan string dalam bentuk:
Untuk melewati ini, saya menggunakan fungsi helper yang mengambil baris dan mengubahnya menjadi kamus. Saya hanya menggunakan ini ketika objek kamus lebih disukai daripada objek Row (misalnya untuk hal-hal seperti pemformatan string di mana objek Row tidak secara native mendukung API kamus juga). Tapi gunakan objek Row di lain waktu.
sumber
print "%(id)i - %(name)s: %(value)s" % dict(row)
Setelah Anda terhubung ke SQLite:
con = sqlite3.connect(.....)
cukup dengan menjalankan:Voila!
sumber
Dari PEP 249 :
Jadi ya, lakukan sendiri.
sumber
Versi lebih pendek:
sumber
Tercepat dalam pengujian saya:
vs:
Kamu putuskan :)
sumber
Seperti yang disebutkan oleh jawaban @ gandalf, harus menggunakan
conn.row_factory = sqlite3.Row
, tetapi hasilnya tidak langsung kamus. Seseorang harus menambahkan "cast" tambahandict
di loop terakhir:sumber
Mirip seperti solusi yang disebutkan sebelumnya, tetapi paling ringkas:
sumber
db.row_factory = sqlite3.Row
tidak berhasil untuk saya (karena menghasilkan JSON TypeError)Saya pikir Anda berada di jalur yang benar. Mari kita pertahankan ini sangat sederhana dan selesaikan apa yang Anda coba lakukan:
Sisi negatifnya adalah
.fetchall()
, yang membunuh konsumsi memori Anda , jika meja Anda sangat besar. Tetapi untuk aplikasi sepele yang berurusan dengan hanya beberapa ribu baris teks dan kolom numerik, pendekatan sederhana ini sudah cukup baik.Untuk hal-hal serius, Anda harus melihat pabrik baris, seperti yang diusulkan dalam banyak jawaban lain.
sumber
Atau Anda dapat mengonversi sqlite3. Baris ke kamus sebagai berikut. Ini akan memberikan kamus dengan daftar untuk setiap baris.
sumber
Alternatif umum, hanya menggunakan tiga baris
Tetapi jika kueri Anda tidak mengembalikan apa-apa, akan menghasilkan kesalahan. Pada kasus ini...
atau
sumber
Hasilnya pasti benar, tapi saya tidak tahu yang terbaik.
sumber
Kamus dalam python menyediakan akses sewenang-wenang ke elemen mereka. Jadi setiap kamus dengan "nama" meskipun mungkin informatif di satu sisi (alias apa nama bidang) "membatalkan pesanan" bidang, yang mungkin tidak diinginkan.
Pendekatan terbaik adalah memasukkan nama dalam daftar terpisah dan kemudian menggabungkannya dengan hasil sendiri, jika diperlukan.
Ingat juga bahwa nama, dalam semua pendekatan, adalah nama yang Anda berikan dalam kueri, bukan nama dalam database. Pengecualian adalah
SELECT * FROM
Jika satu-satunya perhatian Anda adalah mendapatkan hasil menggunakan kamus, maka pasti gunakan
conn.row_factory = sqlite3.Row
(sudah dinyatakan di jawaban lain).sumber