sqlite3.ProgrammingError:提供されたバインディングの数が正しくありません。現在のステートメントは1を使用し、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()

これがエラーを引き起こしている理由がわかりません。挿入しようとしている実際の文字列は74文字です。「/ gifs / epic-fail-photos-there-i-fixed-it-aww-man-the -tire-pressures-low.gif」

挿入する前にstr(array [cnt])を試しましたが、同じ問題が発生しています。データベースにはTEXT値である1つの列しかありません。

私は何時間もそこにいて、何が起こっているのか理解できません。

回答:


380

シーケンスを渡す必要がありますが、パラメーターをタプルにするためのコンマを忘れました。

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

コンマがなければ、(img)グループ化された式であり、タプルではないため、img文字列は入力シーケンスとして扱われます。その文字列が74文字の長さである場合、Pythonはそれを74文字のバインド値として認識し、それぞれ1文字の長さになります。

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

読みやすい場合は、リストリテラルを使用することもできます。

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

37
私たちはその間違いを犯した多くの高度なコーダーなので、愚かである必要はありません。:)
MrGumble 2013年

6
これも私を噛んだ。「高度なコーダー」がこれにだまされた場合、それは直感的でないことを意味します。私見これが1つしかない場合、execute()が単一値のタプルではなく単一値を取ると、より自然になりますか?クエリ内。とにかく、ヒントをありがとう!
Laryx Decidua 2013

5
@ user465139:上の%演算子strは、そのような魔法を実行します。タプルは複数の値として扱われますが、str(またはその他の種類の反復可能オブジェクト)は単一の値として扱われます。しかし、それはそれを解決するよりもはるかに頻繁に混乱を引き起こします。そのため、stdlibの他のほとんどはその種の魔法を試みません。
abarnert 2014年

%sセキュリティ上の理由
wesinat0r

2
cursor.execute(sql,array)

2つの引数のみを受け取ります。
「配列」オブジェクトを反復して照合しますか?sql-string内。
(SQLインジェクションを回避するための健全性チェック付き)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.