当尝试使用psycopg2更新Postgres中json类型的列时,发生以下错误: psycopg2.ProgrammingError:无法适应类型“ dict”
我正在运行以下代码:
self.cursor.execute("UPDATE tb_games SET infos_json = %s WHERE id = 10",
(json.dumps({'v1':'a','v2':'b'})))
conexao.commit()
我传递给json.dumps()的json有效,我已经对其进行了测试。有人知道我可能做错了吗?
答案 0 :(得分:1)
execute
的第二个参数应为sequence, such as a tuple:
self.cursor.execute("UPDATE tb_games SET infos_json = %s WHERE id = 10",
(json.dumps({'v1':'a','v2':'b'}),) )
请注意,(json.dumps({'v1':'a','v2':'b'}),)
中的逗号使表达式成为一个元组(包含一个元素)。没有它,括号中的整个表达式将作为字符串求值。
In [52]: type((json.dumps({'v1':'a','v2':'b'}),))
Out[52]: tuple
In [53]: type((json.dumps({'v1':'a','v2':'b'})))
Out[53]: str
要确保在与光标commit
关联的连接上调用self.cursor
,
最好打电话给
self.cursor.connection.commit()
代替
conexao.commit()
或者,使用connection as a context manager:
with conexao:
with conexao.cursor() as cursor:
cursor.execute("UPDATE tb_games SET infos_json = %s WHERE id = 10",
(json.dumps({'v1':'a','v2':'b'}),) )
当Python的执行流程离开外部with
块时,将提交事务,除非在发生错误的情况下使事务回滚。这使得更容易
持续执行commit/rollback
行为,而无需编写大量样板代码。