2009-04-27 19 views
10
Bir PG tabloya ikili veri (girdap karma) eklemeye çalışıyorum ve bir hata alıyorum

:psycopg2 "TypeError: biçimlendirme dize sırasında dönüştürülmemiş tüm argümanlar"

TypeError: not all arguments converted during string formatting 

kodu:

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

Eklemeden önce değişkene conn.Binary ("identity_hash") eklemeyi denedim, ancak aynı hatayı aldım.

identity_hash sütunu bir bytea'dır.

Herhangi bir fikrin var mı?

cevap

6

psycopg2 kaynak dağıtımındaki "samples/binary.py" betiğine bir göz attınız mı? Burada iyi çalışıyor. Bu sizin alıntı biraz daha farklı görünüyor:

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

Ben başarısız pyscopg2 kılavuzu her yerde aradım kaplı olduğunu tespit ettik. Ben lib çalıştı MySQLdb benzer şekilde çalıştı, ama sanırım yok .. – Ian

+0

Kılavuzdan: "Pozisyonel değişkenler için bağlama, ikinci argüman tek bir değişken içeriyor olsa bile * her zaman * bir dizi olmalıdır * Ve unutmayın Python tek bir eleman tuple * oluşturmak için bir virgül gerektirir * - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

sahip sorun ikinci parametre olarak nesneyi geçiyoruz yani saniye parametreleri tuple veya dict ya olmalıdır. % Dize işlecinde olduğu gibi kısayol yoktur.

Sen yapmalıdır:

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

ugh, bu Beni yakalayan gotcha - bu bana kabul edilen –

+1

Ditto yanıtından daha alakalı görünüyor. Lütfen kabul edilen cevabı düzenleyin veya bunu işaretleyin. – phooky

7

aynı sorunla karşılaşıldı ve bu aslında onların 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 
İlgili konular