2009-04-27 7 views
10

Estoy tratando de insertar datos binarios (cifrado de hidromasaje) en una tabla PG y estoy recibiendo un error:psycopg2 "TypeError: no todos los argumentos convertidos en formato de cadenas"

TypeError: not all arguments converted during string formatting 

código:

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

Intenté agregar conn.Binary ("identity_hash") a la variable antes de la inserción, pero obtengo el mismo error.

La columna identity_hash es un bytea.

¿Alguna idea?

Respuesta

6

¿Has echado un vistazo al script "examples/binary.py" en la distribución fuente psycopg2? Funciona bien aquí. Se ve un poco diferente que su extracto:

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

que he estado buscando por todas partes para el manual pyscopg2 sin éxito. Supuse que la lib funcionaba de manera similar a MySQLdb, pero supongo que no ... – Ian

+0

Del manual: "Para el enlace de variables posicionales, el segundo argumento debe * siempre * ser una secuencia, incluso si contiene una sola variable . * Y recuerde que Python requiere una coma para crear una sola tupla de elemento * "- http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

El problema que tiene es que está pasando el objeto como segundo parámetro: los segundos parámetros deben ser una tupla o un diccionario. No hay atajos como en el operador% string.

que debe hacer:

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

ugh, este es el Me dijé que esto me pareció más relevante que la respuesta aceptada. –

+1

Ídem. Por favor edite la respuesta aceptada o marque esto. – phooky

7

encontrado el mismo problema y encontró que este es en realidad cubierto en su 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 
Cuestiones relacionadas