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

Psycopg3中将字典插入JSONB字段报错,寻求解决方法

问题描述

我有一张包含JSONB字段的表,想用命名字典参数向表中插入数据,代码示例如下:

sql = "INSERT INTO tbl (id, json_fld) VALUES (%(id)s, %(json_fld)s)"
conn.execute(sql, {'id':1, 'json_fld': {'a':1,'b':False, 'c': 'yes'}});

我试过针对Psycopg2的解决方案,但这些方法在Psycopg3里不生效。比如我尝试了以下代码:

conn.execute(sql, {'id':1, 'json_fld': json.dumps({'a':1,'b':False, 'c': 'yes'})});

但还是遇到相同错误:

psycopg.ProgrammingError: cannot adapt type 'dict' using placeholder '%s' (format: AUTO)

解决方案

Psycopg3对JSON类型的适配逻辑和Psycopg2不同,推荐用以下两种方法解决:

  • 方法1:用psycopg.types.json.Json包装字典
    直接使用Psycopg3提供的Json类型包装Python字典,它会自动适配PostgreSQL的JSONB字段:
from psycopg.types.json import Json

sql = "INSERT INTO tbl (id, json_fld) VALUES (%(id)s, %(json_fld)s)"
conn.execute(sql, {'id':1, 'json_fld': Json({'a':1,'b':False, 'c': 'yes'})})
  • 方法2:启用全局自动JSON适配
    如果不想每次手动包装,可全局注册自动适配规则,让Psycopg3自动将Python的dict、list等类型转为JSONB:
from psycopg.types.json import register_json

# 注册自动适配
register_json(conn)

sql = "INSERT INTO tbl (id, json_fld) VALUES (%(id)s, %(json_fld)s)"
conn.execute(sql, {'id':1, 'json_fld': {'a':1,'b':False, 'c': 'yes'}})

注意:如果用json.dumps转成字符串,需要在SQL中显式转换类型(比如%(json_fld)s::jsonb),但这种方式不如上面两种简洁可靠。

内容的提问来源于stack exchange,提问作者Frank Conry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:53:29