sqlite3.ProgrammingError: Jumlah binding yang disediakan salah. Pernyataan saat ini menggunakan 1, dan ada 74 yang disediakan

187
def insert(array):
    connection=sqlite3.connect('images.db')
    cursor=connection.cursor()
    cnt=0
    while cnt != len(array):
            img = array[cnt]
            print(array[cnt])
            cursor.execute('INSERT INTO images VALUES(?)', (img))
            cnt+= 1
    connection.commit()
    connection.close()

Saya tidak tahu mengapa ini memberi saya kesalahan, String aktual yang saya coba masukkan adalah panjangnya 74 karakter: "/ gifs / epic-fail-photos-there-i-fix-it-aww-man-the-the -tire-pressureures-low.gif "

Saya sudah mencoba str (array [cnt]) sebelum memasukkannya, tetapi masalah yang sama terjadi, database hanya memiliki satu kolom, yang merupakan nilai TEXT.

Saya sudah berjam-jam dan tidak tahu apa yang sedang terjadi.

AB49K
sumber

Jawaban:

380

Anda harus meneruskan secara berurutan, tetapi Anda lupa koma untuk membuat parameter Anda menjadi tuple:

cursor.execute('INSERT INTO images VALUES(?)', (img,))

Tanpa koma, (img)hanya ekspresi yang dikelompokkan, bukan tupel, dan dengan demikian imgstring diperlakukan sebagai urutan input. Jika string tersebut panjangnya 74 karakter, maka Python melihat bahwa 74 nilai mengikat yang terpisah, masing-masing karakter panjang.

>>> len(img)
74
>>> len((img,))
1

Jika Anda merasa lebih mudah dibaca, Anda juga dapat menggunakan daftar literal:

cursor.execute('INSERT INTO images VALUES(?)', [img])
Martijn Pieters
sumber
37
Kami banyak coders canggih yang melakukan kesalahan itu, jadi tidak perlu merasa bodoh. :)
MrGumble
6
Ini juga menggangguku. Jika "coders tingkat lanjut" tertipu oleh ini, itu berarti tidak intuitif. IMHO akan lebih alami jika mengeksekusi () mengambil nilai tunggal daripada tuple bernilai tunggal jika hanya ada satu? dalam kueri. Bagaimanapun, terima kasih atas petunjuknya!
Laryx Decidua
5
@ user465139: %Operator aktif strmelakukan sihir semacam itu — ia memperlakukan tupel sebagai beberapa nilai, tetapi a str(atau jenis lain yang dapat diubah) sebagai nilai tunggal. Tapi itu menyebabkan kebingungan jauh lebih sering daripada memecahkannya, itulah sebabnya hampir tidak ada yang lain dalam stdlib yang mencoba sihir semacam itu.
abarnert
menggunakan %sjuga tidak disarankan untuk masalah keamanan - docs.python.org/3/library/sqlite3.html
wesinat0r
2
cursor.execute(sql,array)

Hanya butuh dua argumen.
Ini akan mengulangi "array" -Tujuan dan cocok? dalam sql-string.
(dengan pemeriksaan kewarasan untuk menghindari injeksi sql)

Punnerud
sumber