使用SQLAlchemy插入Pydantic Schema至PostgreSQL时jsonref加载报错
问题修复方案
核心原因
jsonref.loads(Mdl.schema_json())返回的字典中嵌套了JSONRef类型对象(并非纯原生Python dict/list),虽然表面结构是字典,但实际类型不满足SQLAlchemy JSONB字段的序列化要求,因此触发报错。
解决方法
方法1:强制转换为原生Python数据结构
通过json.dumps()再json.loads()的二次转换,把JSONRef对象彻底转为原生dict:
import json from jsonref import loads # 先转成JSON字符串,再转回原生字典 schema_data = json.loads(json.dumps(loads(Mdl.schema_json()))) # 执行插入操作 db.session.add(YourModel(jsonb_field=schema_data)) db.session.commit()
方法2:使用jsonref内置工具替换引用
直接调用jsonref的replace_refs方法,生成纯原生数据结构:
from jsonref import loads, replace_refs schema_data = replace_refs(loads(Mdl.schema_json())) # 执行插入操作 db.session.add(YourModel(jsonb_field=schema_data)) db.session.commit()
方法3:自定义SQLAlchemy字段类型
如果需要频繁处理这类数据,可以自定义JSONB类型,自动处理JSONRef对象:
import json from jsonref import replace_refs from sqlalchemy.types import JSONB from sqlalchemy import Column, Integer, Base class JSONRefB(JSONB): def process_bind_param(self, value, dialect): if value is not None: # 替换所有JSONRef为原生结构 value = replace_refs(value) return super().process_bind_param(value, dialect) # 模型定义时使用自定义类型 class YourModel(Base): __tablename__ = "your_table" id = Column(Integer, primary_key=True) jsonb_field = Column(JSONRefB)
验证方式
可以打印嵌套字段的类型确认问题:
from jsonref import loads data = loads(Mdl.schema_json()) print(type(data.get('properties', {}).get('target_field'))) # 会输出JSONRef类型
内容的提问来源于stack exchange,提问作者Galuoises
相关产品推荐
相关产品推荐

