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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:03:20