使用python更新PostgreSQL中的json列时出错

时间:2019-03-24 18:03:42

标签: python postgresql

当尝试使用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有效,我已经对其进行了测试。有人知道我可能做错了吗?

1 个答案:

答案 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行为,而无需编写大量样板代码。