sqlite3.ProgrammingError: número incorrecto de enlaces suministrados. La declaración actual usa 1, y se suministran 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()

No puedo entender por qué esto me está dando el error. La cadena real que estoy tratando de insertar es de 74 caracteres, es: "/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-pressures-low.gif "

Intenté str (array [cnt]) antes de insertarlo, pero ocurre el mismo problema, la base de datos solo tiene una columna, que es un valor de TEXTO.

He estado en esto durante horas y no puedo entender qué está pasando.

AB49K
fuente

Respuestas:

380

Necesita pasar una secuencia, pero olvidó la coma para hacer que sus parámetros sean una tupla:

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

Sin la coma, (img)es solo una expresión agrupada, no una tupla, por lo que la imgcadena se trata como la secuencia de entrada. Si esa cadena tiene 74 caracteres de longitud, Python lo ve como 74 valores de enlace separados, cada uno de ellos.

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

Si le resulta más fácil de leer, también puede usar una lista literal:

cursor.execute('INSERT INTO images VALUES(?)', [img])
Martijn Pieters
fuente
37
Somos muchos codificadores avanzados que han cometido ese error, por lo que no es necesario sentirse estúpido. :)
MrGumble
66
Esto también me mordió. Si esto engaña a los "codificadores avanzados", significa que no es intuitivo. En mi humilde opinión, sería más natural si execute () tomó un solo valor en lugar de una tupla de un solo valor si solo hay uno. en la consulta De todos modos, gracias por la pista!
Laryx Decidua
55
@ user465139: El %operador en strhace ese tipo de magia: trata una tupla como valores múltiples, pero un str(o cualquier otro tipo de iterable) como un valor único. Pero eso causa confusión mucho más a menudo de lo que lo resuelve, razón por la cual casi nada más en el stdlib intenta ese tipo de magia.
abarnert
%stampoco se recomienda usar para problemas de seguridad - docs.python.org/3/library/sqlite3.html
wesinat0r
2
cursor.execute(sql,array)

Solo toma dos argumentos.
¿Iterará el objeto "array" y coincidirá? en la cadena sql.
(con controles de cordura para evitar la inyección de sql)

Punnerud
fuente