sqlite3.ProgrammingError: número incorreto de ligações fornecidas. A declaração atual usa 1 e há 74 fornecidos

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

Não consigo entender por que isso está me dando o erro. A string real que estou tentando inserir tem 74 caracteres, é: "/ gifs / fotos-épicas-de-falha-lá-eu-consertei-o-aww-man-the -tire-pressures-low.gif "

Eu tentei str (array [cnt]) antes de inseri-lo, mas o mesmo problema está acontecendo, o banco de dados possui apenas uma coluna, que é um valor TEXT.

Estou nisso há horas e não consigo descobrir o que está acontecendo.

AB49K
fonte

Respostas:

380

Você precisa passar em uma sequência, mas esqueceu a vírgula para tornar seus parâmetros uma tupla:

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

Sem a vírgula, (img)é apenas uma expressão agrupada, não uma tupla e, portanto, a imgsequência é tratada como a sequência de entrada. Se essa sequência possui 74 caracteres, o Python vê isso como 74 valores de ligação separados, cada um com um caractere.

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

Se você achar mais fácil ler, também poderá usar uma lista literal:

cursor.execute('INSERT INTO images VALUES(?)', [img])
Martijn Pieters
fonte
37
Nós somos muitos codificadores avançados que cometeram esse erro, por isso não precisa se sentir estúpido. :)
MrGumble
6
Isso também me mordeu. Se "codificadores avançados" forem enganados por isso, isso significa que não é intuitivo. IMHO seria mais natural se execute () assumisse um único valor em vez de uma tupla de valor único, se houver apenas um? na consulta. De qualquer forma, obrigado pela dica!
Laryx Decidua
5
@ user465139: O %operador ativado strfaz esse tipo de mágica - trata uma tupla como vários valores, mas a str(ou qualquer outro tipo de iterável) como um valor único. Mas isso causa confusão com muito mais frequência do que resolve, e é por isso que quase nada no stdlib tenta esse tipo de mágica.
abarnert
o uso %stambém não é recomendado por questões de segurança - docs.python.org/3/library/sqlite3.html
wesinat0r
2
cursor.execute(sql,array)

Leva apenas dois argumentos.
Irá iterar o objeto "array" e corresponder? na string sql.
(com verificações de sanidade para evitar a injeção de sql)

Punnerud
fonte