psycopg2 “TypeError: 字符串格式化时未转换所有参数”
我正在尝试把二进制数据(一个漩涡哈希值)插入到一个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)