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

SQLAlchemy执行查询时JSONB列返回字符串而非字典问题咨询

解决SQLAlchemy原生查询中JSONB列返回字符串而非字典的问题

这个问题我帮不少开发者排查过,核心原因是原生查询绕过了SQLAlchemy ORM的自动类型映射机制——当你直接用engine.execute、session.execute执行原生SQL时,SQLAlchemy不会自动把PostgreSQL的JSONB类型转换成Python字典,而是返回数据库驱动传递的原始字符串(或者取决于驱动的默认配置)。下面是几种靠谱的解决办法:

方法1:让SQLAlchemy明确知道列类型

通过text()构造查询时,显式指定JSONB列的类型,让SQLAlchemy帮你完成转换:

from sqlalchemy import text
from sqlalchemy.dialects.postgresql import JSONB

# 方式A:给text查询绑定列类型
stmt = text("SELECT id, data FROM my_table").columns(
    id=int,
    data=JSONB
)
result = session.execute(stmt)

# 方式B:在SQL中显式转换(PostgreSQL原生语法)
result = session.execute(text("SELECT id, data::jsonb FROM my_table"))

这样查询返回的row.data就是直接可用的Python字典了。

方法2:手动转换字符串为字典

如果已经拿到了字符串结果,可以用Python标准库的json模块手动转换,简单直接:

import json

result = session.execute(text("SELECT id, data FROM my_table"))
for row in result:
    # 把JSON字符串转成字典
    data_dict = json.loads(row.data)
    # 后续处理字典逻辑

方法3:配置数据库驱动的默认行为

如果你用的是psycopg2(PostgreSQL的常用Python驱动),可以在创建引擎时通过连接参数强制JSONB返回字典:

from sqlalchemy import create_engine

engine = create_engine(
    "postgresql://your_user:your_pass@your_host/your_db",
    connect_args={"options": "-c jsonb_as_string=off"}
)

注意:如果是使用psycopg3(最新版驱动),默认就会把JSONB类型转换成Python字典,这个问题大概率不会出现,所以也可以检查下自己的驱动版本是否符合预期。

为什么ORM查询不会有这个问题?

当你在ORM模型里定义了data = Column(JSONB),SQLAlchemy会在查询时自动绑定类型转换器,把数据库返回的JSONB数据转换成Python字典——而原生查询没有这个绑定步骤,所以需要我们手动干预。

内容的提问来源于stack exchange,提问作者Mark Gerolimatos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:25