2013-05-31 5 views
93
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-failsqlite3.ProgrammingError:指定された数のバインディングが正しくありません。現在のステートメントでは1が使用されており、74個が提供されています

私はそれを挿入する前にstr(配列[cnt])しようとしましたが、同じ問題は次のとおりです。データベースにはTEXT値である1つの列しかありません。

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

答えて

192

あなたは順番に合格する必要がありますが、あなたはパラメータタプルを作るためにカンマを忘れてしまった:

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

コンマなしで、(img)だけでグループ化された表現ではなく、タプルであり、したがってimg stringは入力シーケンスとして扱われます。その文字列の長さが74文字の場合、Pythonはそれを74文字の分離したバインド値として認識します。

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

あなたはそれが簡単に読み取ることが判明した場合、あなたはまた、リストリテラルを使用することができます。

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

私たちは、そのミスを犯してきた高度なプログラマーの多く、とても愚かな感じする必要はありませんです。 :) – MrGumble

+1

このビット私も。 「高度なコーダー」がこれに惑わされた場合、それは直感的ではないことを意味します。 IMHO 1つしかない場合、execute()が単一値のタプルの代わりに単一の値を取った場合、より自然なことでしょうか?クエリ内にあります。とにかく、ヒントありがとう! –

+3

@ user465139: 'str'の'% '演算子は、タプルを複数の値として扱いますが、 'str'(または他の種類のiterable)を単一の値として扱います。しかし、それはそれを解決するよりもはるかに頻繁に混乱の原因となります。なぜなら、stdlibの他の誰もそのような魔法を試みることはほとんどありません。 – abarnert

関連する問題