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

