You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python更新PostgreSQL JSON数据失败,请求技术协助

问题排查与解决方案

针对你使用psycopg2更新PostgreSQL JSON字段时的报错问题,以下是常见问题点及修复方案:

1. JSON字段类型与数据传递方式不匹配

PostgreSQL的json/jsonb字段支持直接传入Python字典,无需手动用json.dumps转换为字符串。psycopg2会自动处理类型转换,手动转字符串反而可能引发类型不兼容错误(比如字段为jsonb时,传入字符串会被当作文本而非JSON对象存储,触发类型校验失败)。

修改后的代码:

cursor = connection.cursor()
updated_data = {
    "Name": "John",
    "Age": 53,  # 若JSON中Age预期为数字类型,避免存字符串
    "SSN": "374875430"
}
row_id = 1
try:
    # 直接传入Python字典,无需json.dumps转换
    update_query = """
    UPDATE my_table
    SET json_data = %s
    WHERE id = %s;
    """
    cursor.execute(update_query, (updated_data, row_id))
    # 查看实际影响行数,确认是否命中目标记录
    print(f"更新了 {cursor.rowcount} 行")
    connection.commit()
    print("JSON data updated successfully!")
except (Exception, psycopg2.DatabaseError) as error:
    connection.rollback()
    # 打印完整错误栈,获取更精准的报错信息
    import traceback
    traceback.print_exc()
    print("Error while updating JSON data:", str(error))
finally:
    cursor.close()
    connection.close()

2. 检查字段类型与数据格式

  • 确认my_table中的json_data字段类型为json或jsonb,而非text。若为text字段,建议改为jsonb以获得更好的兼容性和查询性能。
  • 校验updated_data的格式:比如Age如果在数据库中预期是数字,就不要传字符串"53",改为整数53,避免因JSON类型不一致导致隐性错误。

3. 权限与记录存在性验证

  • 确认执行更新的数据库用户对my_table拥有UPDATE权限。
  • 检查row_id = 1对应的记录是否存在:若记录不存在,更新操作不会报错,但影响行数为0,容易被误认为更新失败,通过cursor.rowcount可快速确认。

内容的提问来源于stack exchange,提问作者Mahina Sheikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:40:11