248 votes

sqlite3.Erreur de programmation : Nombre incorrect de liaisons fournies. L'instruction actuelle utilise 1, et il y a 74 liaisons fournies.

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 n'arrive pas à comprendre pourquoi cela me donne cette erreur. La chaîne que j'essaie d'insérer fait 74 caractères, c'est : "/gifs/epic-fail-photos-there-i-fixed-it-aww-man-the-tire-pressures-low.gif".

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

Je suis dessus depuis des heures et je n'arrive pas à comprendre ce qui se passe.

514voto

Martijn Pieters Points 271458

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

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

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

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

Si vous trouvez cela plus facile à lire, vous pouvez également utiliser une liste littérale :

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

0voto

cards Points 349

Vous êtes troublé par le fait que vous avez affaire à un données en une seule colonne mais la syntaxe est compatible avec le traitement de plusieurs colonnes à la fois, d'où la raison de transformer votre chaîne en un tuple.

Vous pouvez le réparer avec zip : cursor.execute('INSERT INTO images VALUES(?)', zip(img)) .

Pour éviter de multiples execute -vous pouvez stocker les chaînes de caractères dans une liste et mettre à jour votre tableau en un seul appel avec la fonction executemany :

def insert(array):
    connection = sqlite3.connect('images.db')
    cursor = connection.cursor()
    cnt = 0
    imgs = []
    while cnt != len(array):
        img = array[cnt]
        print(array[cnt])
        imgs.append(img)
        cnt += 1

    cursor.executemany('INSERT INTO images VALUES(?)', zip(imgs))

executemany est orienté vers les rangs et zip transforme les "colonnes" de imgs en rangs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X