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
相关产品推荐
相关产品推荐

