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

Python向MSSQL插入JSON字典遇阻:关联与插入双问题求助

问题与解决方案

问题1:基于'id'字段关联JSON对象与DataFrame

从API获取JSON对象列表,需将每个JSON对象作为一列加入由该列表转换的标准DataFrame中。目前通过索引关联Series与DataFrame实现,但希望改为基于JSON字典和DataFrame中的'id'字段关联,消除顺序依赖,确保对应关系准确。

问题2:含JSON字典的列插入MSSQL报错

关联后的DataFrame使用to_sql插入MSSQL时,含JSON字典的'Json_Series'列报错:

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('Invalid parameter type. param-index=0 param-type=dict', 'HY105')

尝试过astype('str')无效,希望找到无需自定义插入语句的通用解决方案。


附相关代码

Python数据处理代码

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.engine import URL

data = [{"id": 1, "value": 2}, {"id": 3, "value": 4}]
df = pd.Series(data, name='Json_Series')
df2= pd.DataFrame(data)
inner_merged = pd.merge(df, df2, left_index=True, right_index=True)
print(df)
print(df2)
# inner_merged['Json_Series'] = inner_merged['Json_Series'].astype('str')
print(inner_merged)

MSSQL建表语句

CREATE TABLE [dbo].[TestInsert_JsonObject_Python](
    [Json_Series] [varchar](500) NULL,
    [id] [int] NULL,
    [value] int Null,
) 
GO

CREATE TABLE [dbo].[TestInsert_NoJsonObject_Python](
    [id] [int] NULL,
    [value] int Null,
) 
GO

数据库插入代码

server = 'enteryourserver'
database = 'enteryourdatabase'
username = 'enteryourusername'
password = 'enteryourpassword'
driver = '{ODBC Driver 18 for SQL Server}'
table1 = 'TestInsert_NoJsonObject_Python'
table2 = 'TestInsert_JsonObject_Python'
schema = 'dbo'

connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})
engine = create_engine(connection_url)

df2.to_sql(table1, con=engine, schema= schema, if_exists='replace', index=False)
inner_merged.to_sql(table2, con=engine, schema= schema, if_exists='replace', index=False)

解决方案

针对问题1:基于'id'字段关联的实现

不需要依赖索引关联,直接从原始JSON列表中提取'id'作为Series的索引,再和DataFrame按'id'字段合并,彻底消除顺序依赖:

data = [{"id": 1, "value": 2}, {"id": 3, "value": 4}]
# 提取每个JSON的id作为Series的索引
df = pd.Series(data, index=[item['id'] for item in data], name='Json_Series')
df2 = pd.DataFrame(data)
# 按'id'字段精准匹配合并
inner_merged = pd.merge(df.reset_index(names='id'), df2, on='id')
print(inner_merged)

针对问题2:解决JSON字典插入MSSQL的报错

astype('str')无效是因为Pandas仍会将字典识别为非字符串类型,需用json.dumps将字典序列化为标准JSON字符串,确保字段类型与MSSQL的varchar兼容:

完整处理代码

import pandas as pd
import json
from sqlalchemy import create_engine
from sqlalchemy.engine import URL

data = [{"id": 1, "value": 2}, {"id": 3, "value": 4}]
df = pd.Series(data, index=[item['id'] for item in data], name='Json_Series')
df2 = pd.DataFrame(data)
inner_merged = pd.merge(df.reset_index(names='id'), df2, on='id')

# 将字典列序列化为标准JSON字符串
inner_merged['Json_Series'] = inner_merged['Json_Series'].apply(json.dumps)

# 数据库插入执行
server = 'enteryourserver'
database = 'enteryourdatabase'
username = 'enteryourusername'
password = 'enteryourpassword'
driver = '{ODBC Driver 18 for SQL Server}'
table2 = 'TestInsert_JsonObject_Python'
schema = 'dbo'

connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})
engine = create_engine(connection_url)

inner_merged.to_sql(table2, con=engine, schema=schema, if_exists='replace', index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45