2009-04-27 28 views
10

を私はPGテーブルにバイナリデータ(ワールプールハッシュ)を挿入しようとしているし、エラーを取得しています:psycopg2「TypeError例外:文字列中に変換すべての引数の書式ない」

TypeError: not all arguments converted during string formatting 

コード:

cur.execute(""" 
    INSERT INTO 
     sessions 
     (identity_hash, posted_on) 
    VALUES 
     (%s, NOW()) 
""", identity_hash) 

私は、挿入前に変数にconn.Binary( "identity_hash")を追加しようとしましたが、同じエラーが発生しました。

identity_hash列はbyteaです。

アイデア?

答えて

6

psycopg2ソースディストリビューションの "examples/binary.py"スクリプトを見ましたか?ここでうまく動作します。それはあなたの抜粋よりも少し違って見える:あなたが持っている

data1 = {'id':1, 'name':'somehackers.jpg', 
    'img':psycopg2.Binary(open('somehackers.jpg').read())} 

curs.execute("""INSERT INTO test_binary 
       VALUES (%(id)s, %(name)s, %(img)s)""", data1) 
+0

で覆われていることがわかりました。私はlibdbをMySQLdbと同様の方法で動かすと仮定していましたが、それはないと思います。 – Ian

+0

マニュアルから: "位置変数バインディングの場合、2つ目の引数は常に1つの変数* Pythonは単一の要素タプルを作成するためにコンマを必要とすることを覚えておいてください* " - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

問題は、あなたが2番目のパラメータとしてオブジェクトを渡しているということである。第二のパラメータは、タプルや辞書のいずれかでなければなりません。 %string演算子のようなショートカットはありません。あなたがすべき

cur.execute(""" 
    INSERT INTO 
     sessions 
     (identity_hash, posted_on) 
    VALUES 
     (%s, NOW()) 
""", (identity_hash,)) 
+2

ugh、これは私をつかまえたばかだ - これは受け入れられた答えよりも関連性が高いと思われる –

+1

同点。受け入れられた答えを編集するか、これをマークしてください。 – phooky

7

同じ問題が発生したため、私は失敗したpyscopg2マニュアルのためにどこでも探していた、これは実際に彼らのFAQ

I try to execute a query but it fails with the error not all arguments converted during string formatting (or object does not support indexing). Why? Psycopg always require positional arguments to be passed as a sequence, even when the query takes a single parameter. And remember that to make a single item tuple in Python you need a comma! See Passing parameters to SQL queries.

cur.execute("INSERT INTO foo VALUES (%s)", "bar") # WRONG 
cur.execute("INSERT INTO foo VALUES (%s)", ("bar")) # WRONG 
cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct 
cur.execute("INSERT INTO foo VALUES (%s)", ["bar"]) # correct 
関連する問題