sqlite3.ProgrammingError: numero errato di binding forniti. La dichiarazione corrente utilizza 1 e ne sono forniti 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()

Non riesco a capire perché questo mi stia dando l'errore, la stringa effettiva che sto cercando di inserire è lunga 74 caratteri, è: "/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-pressioni-low.gif"

Ho provato a str (array [cnt]) prima di inserirlo, ma si sta verificando lo stesso problema, il database ha solo una colonna, che è un valore TEXT.

Ci sono stato per ore e non riesco a capire cosa sta succedendo.

Risposte:


380

Devi passare una sequenza, ma hai dimenticato la virgola per rendere i tuoi parametri una tupla:

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

Senza la virgola, (img)è solo un'espressione raggruppata, non una tupla, e quindi la imgstringa viene trattata come sequenza di input. Se quella stringa è lunga 74 caratteri, Python vede che come 74 valori di bind separati, ognuno di essi è lungo.

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

Se lo trovi più facile da leggere, puoi anche usare un elenco letterale:

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

37
Abbiamo molti programmatori avanzati che hanno commesso questo errore, quindi non c'è bisogno di sentirsi stupidi. :)
MrGumble

6
Anche questo mi ha morso. Se "programmatori avanzati" vengono ingannati da ciò, significa che non è intuitivo. IMHO sarebbe più naturale se execute () prendesse un singolo valore invece di una tupla a valore singolo se ce n'è solo uno? nella query. Comunque, grazie per il suggerimento!
Laryx Decidua,

5
@ user465139: l' %operatore su strfa quel tipo di magia: tratta una tupla come valori multipli, ma un str(o qualsiasi altro tipo di iterabile) come un singolo valore. Ma ciò provoca confusione molto più spesso di quanto non risolva, motivo per cui quasi nulla nello stdlib tenta quel tipo di magia.
Abarnert,

utilizzando %snon è raccomandato anche per i problemi di sicurezza - docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

Accetta solo due argomenti.
Itererà l'oggetto "array" e corrisponderà? nella stringa sql.
(con controlli di integrità per evitare l'iniezione sql)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.