2009-04-27 6 views
10

Ich binäre Daten einzufügen bin versucht (Whirlpool Hash) in eine PG-Tabelle und bin immer einen Fehler:psycopg2 „Typeerror: nicht alle während Zeichenfolge konvertiert Argumente Formatierung“

TypeError: not all arguments converted during string formatting 

Code:

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

Ich habe versucht, conn.Binary ("identity_hash") der Variablen vor dem Einfügen hinzuzufügen, aber den gleichen Fehler zu erhalten.

Die Spalte identity_hash ist ein Bytea.

Irgendwelche Ideen?

Antwort

6

Haben Sie sich das Skript "examples/binary.py" in der Quellenverteilung von psycopg2 angesehen? Es funktioniert gut hier. Es sieht ein bisschen anders als Ihr Auszug:

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

Ich habe erfolglos überall für das pyscopg2 Handbuch gesucht. Ich nahm an, dass die lib in ähnlicher Weise wie MySQLdb arbeitete, aber ich denke, es ist nicht .. – Ian

+0

Aus dem Handbuch: "Für positionale Variablen verbindlich, muss das zweite Argument * immer * eine Sequenz sein, auch wenn es eine einzige Variable enthält . * Und denken Sie daran, dass Python ein Komma benötigt, um ein einzelnes Element-Tupel zu erzeugen * "- http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

Das Problem, das Sie haben, ist, dass Sie das Objekt als zweite Parameter werden übergeben: die zweiten Parameter sollen entweder ein Tupel oder ein dict sein. Es gibt keine Verknüpfung wie im Operator% string.

sollten Sie tun:

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

ugh, das ist die Gotcha das hat mich - das scheint mir relevanter als die angenommene Antwort –

+1

Dito. Bitte bearbeiten Sie die angenommene Antwort oder markieren Sie diese. – phooky

7

das gleiche Problem festgestellt und festgestellt, dass dies tatsächlich in ihre FAQ bedeckt

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 
Verwandte Themen