psycopg2 “TypeError: 字符串格式化时未转换所有参数”

11 投票
3 回答
20805 浏览
提问于 2025-04-15 11:16

我正在尝试把二进制数据(一个漩涡哈希值)插入到一个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 这一列是 bytea 类型。

有没有什么建议?

3 个回答

13

我遇到了同样的问题,发现这个其实在他们的常见问题解答里有提到。

我尝试执行一个查询,但出现了错误,提示不是所有的参数在字符串格式化时都被转换(或者对象不支持索引)。这是为什么呢?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
32

你遇到的问题是,你把一个对象作为第二个参数传递了。其实第二个参数应该是一个元组或者字典。这里没有像%字符串操作符那样的简便方法。

你应该这样做:

cur.execute("""
    INSERT INTO
        sessions
        (identity_hash, posted_on)
    VALUES
        (%s, NOW())
""", (identity_hash,))
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)

撰写回答