web-dev-qa-db-fra.com

sqlite3.ProgrammingError: Nombre incorrect de liaisons fournies. La déclaration actuelle utilise 1, et il y en a 74 fournis

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

Je ne peux pas comprendre pourquoi cela me donne l'erreur. La chaîne que j'essaie d'insérer a une longueur de 74 caractères, elle est: "/ gifs/epic-fail-photos-there-i-fixed-it-aww-man-the -tire-pressions-low.gif "

J'ai essayé de str (tableau [cnt]) avant de l'insérer, mais le même problème se produit, la base de données n'a qu'une colonne, qui est une valeur TEXT.

J'y travaille depuis des heures et je n'arrive pas à comprendre ce qui se passe.

118
AB49K

Vous devez passer une séquence, mais vous avez oublié la virgule pour transformer vos paramètres en tuple:

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

Sans la virgule, (img) est simplement une expression groupée et non un tuple. La chaîne img est donc traitée comme une séquence d'entrée. Si cette chaîne comporte 74 caractères, Python considère alors que 74 valeurs de liaison distinctes, chacune d'un caractère.

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

Si vous trouvez plus facile à lire, vous pouvez également utiliser un littéral de liste:

cursor.execute('INSERT INTO images VALUES(?)', [img])
268
Martijn Pieters
cursor.execute(sql,array)

Prend seulement deux arguments.
Il va itérer l'objet "array" et correspondre? dans la chaîne sql.
(avec des contrôles de santé pour éviter l'injection sql)

0
Punnerud