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

使用pd.read_sql读取SQL数据时如何直接解析JSON字段拆分为多列

完全可以实现,更推荐优先在SQL查询阶段完成JSON解析,比读取到Python后再处理性能更高,也符合计算下沉的优化原则。

方法1:SQL端直接解析(最优方案)

MSSQL 2016及更高版本内置了JSON处理函数,你可以直接在查询语句中提取JSON字段的属性,读出来就是你需要的3列DataFrame,无需额外Python侧处理:

import urllib
import sqlalchemy as sa
import pandas as pd

params = urllib.parse.quote_plus("bla")
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

with engine.connect() as con:
    sql_df = pd.read_sql(
            """
            SELECT TOP 10 
                JSON_VALUE(json_column, '$.c1') AS c1,
                JSON_VALUE(json_column, '$.c2') AS c2,
                id 
            FROM SomeTable;
            """,
            con=con
    )

如果JSON字段内需要提取的属性很多,可以改用OPENJSON语法批量解析,写法更简洁。

方法2:Python端读取后同步解析

如果你没有权限修改查询SQL,也可以读取后用pandas内置的JSON解析工具处理:

import urllib
import json
import sqlalchemy as sa
import pandas as pd

params = urllib.parse.quote_plus("bla")
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

with engine.connect() as con:
    sql_df = pd.read_sql(
            "SELECT TOP 10 json_column, id FROM SomeTable;",
            con=con
    )

# 解析JSON字段并合并
json_parsed = pd.json_normalize(sql_df['json_column'].apply(json.loads))
final_df = pd.concat([sql_df['id'], json_parsed], axis=1)

原代码优化提示:你原代码中pd.read_sql的con参数误传了engine,实际已经通过上下文管理器创建了连接对象con,直接传con=con即可,避免重复创建连接,提升稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:24:03