2009-04-27 12 views
10

मैं एक पीजी तालिका में बाइनरी डेटा (एक भँवर हैश) सम्मिलित करने के लिए कोशिश कर रहा हूँ और एक त्रुटि हो रही है:psycopg2 "लेखन त्रुटि: सभी तर्क स्ट्रिंग स्वरूपण के दौरान परिवर्तित नहीं"

TypeError: not all arguments converted during string formatting 

कोड:

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

मैंने सम्मिलन से पहले परिवर्तक को बाइनरी ("पहचान_शैश") जोड़ने की कोशिश की, लेकिन एक ही त्रुटि प्राप्त करें।

पहचान_शैश कॉलम एक बाइटिया है।

कोई भी विचार?

उत्तर

6

क्या आपने psycopg2 स्रोत वितरण में "उदाहरण/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

मैं असफल pyscopg2 मैनुअल के लिए हर जगह तलाश रहे हैं कवर किया जाता है। मुझे लगता है कि lib ने MySQLdb के समान तरीके से काम किया है, लेकिन मुझे लगता है कि यह नहीं है .. – Ian

+0

मैन्युअल से: "स्थितित्मक चर बाध्यकारी के लिए, दूसरा तर्क * हमेशा * अनुक्रम होना चाहिए, भले ही इसमें एक एकल चर हो । * और याद रखें कि पायथन को एक एकल तत्व टुपल बनाने के लिए एक अल्पविराम की आवश्यकता है * "- http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

समस्या आप है कि आप दूसरे पैरामीटर के रूप में वस्तु से गुजर रहे हैं है: दूसरा पैरामीटर या तो एक टपल या एक dict होना चाहिए। % स्ट्रिंग ऑपरेटर में कोई शॉर्टकट नहीं है।

आप क्या करना चाहिए:

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

ugh, यह है गेटचा जो मुझे मिला - यह मुझे स्वीकार किए गए उत्तर –

+1

Ditto से अधिक प्रासंगिक लगता है। कृपया स्वीकृत उत्तर संपादित करें या इसे चिह्नित करें। – phooky

7

एक ही समस्या का सामना किया है और पाया है कि यह वास्तव में में अपने 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 
संबंधित मुद्दे