12

我正在尝试将二进制数据(漩涡哈希)插入 PG 表中,但出现错误:

TypeError: not all arguments converted during string formatting 

代码:

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

我尝试在插入之前将 conn.Binary("identity_hash") 添加到变量中,但得到相同的错误。

identity_hash 列是一个字节。

有任何想法吗?

4

3 回答 3

33

您遇到的问题是您将对象作为第二个参数传递:第二个参数应该是元组或字典。没有 % 字符串运算符中的快捷方式。

你应该做:

cur.execute("""
    INSERT INTO
        sessions
        (identity_hash, posted_on)
    VALUES
        (%s, NOW())
""", (identity_hash,))
于 2009-09-29T12:14:57.493 回答
13

遇到同样的问题,发现这其实在他们的FAQ里都有

我尝试执行查询,但它失败并出现错误不是所有参数都在字符串格式化期间转换(或对象不支持索引)。为什么?Psycopg 始终要求将位置参数作为序列传递,即使查询采用单个参数也是如此。请记住,要在 Python 中创建单个项目元组,您需要一个逗号!请参阅将参数传递给 SQL 查询。

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
于 2015-01-09T03:20:36.080 回答
6

您是否看过 psycopg2 源代码分发中的“examples/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)
于 2009-04-27T16:10:04.573 回答