sqlite3.ProgrammingError: Неправильна кількість вкладених прив'язок. У поточному операторі використовується 1, а надається 74


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()

Я не можу зрозуміти, чому це дає мені помилку. Фактична рядок, яку я намагаюся вставити, становить 74 символи, це: "/ gifs / epic-fail-photos-there-i-fix-it-aww-man-the -tire-pressure-low.gif "

Я намагався str (array [cnt]) перед тим, як вставити його, але трапляється та сама проблема, у базі даних є лише один стовпець, який є значенням TEXT.

Я був на цьому годинами і не можу зрозуміти, що відбувається.

Відповіді:


380

Вам потрібно пройти послідовно, але ви забули кому, щоб зробити свої параметри кортежем:

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

Без коми - (img)це просто згрупований вираз, а не кортеж, і таким чином imgрядок трактується як вхідна послідовність. Якщо цей рядок має 74 символи, то Python бачить, що це 74 окремі значення прив'язки, кожне з яких символів.

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

Якщо вам легше читати, ви також можете скористатися переліком списку:

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

37
Ми безліч просунутих кодерів, які допустили цю помилку, тому не потрібно почуватися дурним. :)
MrGumble

6
Це теж мене покусало. Якщо "просунуті кодери" обдурені цим, це означає, що це неінтуїтивно. IMHO, було б більш природно, якби Execute () взяв одне значення замість однозначного кортежу, якщо є лише одне? у запиті. У будь-якому випадку, дякую за підказку!
Laryx Decidua

5
@ user465139: %Оператор strвиконує таку магію - він розглядає кортеж як кілька значень, а str(або будь-який інший вид ітерабельного) як одне значення. Але це викликає плутанину набагато частіше, ніж це вирішує, тому майже нічого іншого в stdlib не намагається здійснити таку магію.
abarnert

використання %sтакож не рекомендується з питань безпеки - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

Вживає лише два аргументи.
Це буде повторювати "масив" -об'єкт і відповідати? у sql-string.
(з перевірками здоровості, щоб уникнути sql-ін'єкції)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.