2009-04-27 45 views
10

Tôi đang cố gắng để chèn dữ liệu nhị phân (một hash xoáy) vào một bảng PG và đang nhận được một lỗi:psycopg2 "Lỗi Loại: không phải tất cả đối số được chuyển đổi trong chuỗi định dạng"

TypeError: not all arguments converted during string formatting 

mã:

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

Tôi đã thử thêm conn.Binary ("identity_hash") vào biến trước khi chèn, nhưng nhận được cùng một lỗi.

Cột identity_hash là dấu gạch ngang.

Bất kỳ ý tưởng nào?

Trả lời

6

Bạn đã xem tập lệnh "examples/binary.py" trong bản phân phối nguồn psycopg2 chưa? Nó hoạt động tốt ở đây. Có vẻ hơi khác so với đoạn trích của bạn:

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

Tôi đã tìm kiếm khắp nơi hướng dẫn pyscopg2 không thành công. Tôi giả sử lib hoạt động theo cách tương tự với MySQLdb, nhưng tôi đoán nó không .. – Ian

+0

Từ hướng dẫn: "Đối với các biến vị trí ràng buộc, đối số thứ hai phải * luôn luôn * là một chuỗi, ngay cả khi nó chứa một biến duy nhất * Và hãy nhớ rằng Python yêu cầu dấu phẩy để tạo một phần tử đơn * * - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries – Ben

19

Vấn đề bạn có là bạn đang chuyển đối tượng làm thông số thứ hai: tham số thứ hai phải là một bộ hoặc một lệnh. Không có phím tắt nào như trong toán tử chuỗi%.

Bạn nên làm:

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

ugh, đây là gotcha đã cho tôi - điều này dường như với tôi có liên quan nhiều hơn câu trả lời được chấp nhận –

+1

Ditto. Vui lòng chỉnh sửa câu trả lời được chấp nhận hoặc đánh dấu mục này. – phooky

7

gặp cùng một vấn đề và thấy rằng đây thực sự là bao gồm trong họ 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 
Các vấn đề liên quan