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

Python将DataFrame上传至SQL Server时遇TypeError问题求助

解决pandas to_sql上传SQL Server时报错expected bytes, str found的问题

这个错误我之前把DataFrame导入SQL Server的时候也踩过坑,从你的报错信息和df.info()的结果来看,问题大概率出在DataFrame的object类型列里混入了字节(bytes)类型的数据——而你目标SQL Server表的varchar(max)字段只接受字符串(str)类型,类型不匹配就引发了这个报错。

下面给你几个针对性的解决步骤:

1. 检查并转换字节类型数据为字符串

Excel导入时可能会把某些单元格内容解析成字节格式,或者原始数据本身就存在这种情况。先遍历所有object类型的列,把其中的bytes数据解码成字符串:

# 遍历所有object类型的列
for col in df.select_dtypes(include=['object']).columns:
    # 对每个单元格判断,如果是bytes类型就解码为utf-8字符串(编码格式可根据你的数据调整,比如gbk)
    df[col] = df[col].apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)

处理完之后可以用df[col].apply(type).unique()检查列内的类型,确保只有str和NaN(空值)。

2. 确认SQLAlchemy引擎的连接配置正确

旧版本的ODBC驱动可能存在兼容性问题,建议使用最新的ODBC Driver 17 for SQL Server构建连接字符串,示例代码如下:

from sqlalchemy import create_engine
import urllib

# 构建连接参数
params = urllib.parse.quote_plus(
    'DRIVER={ODBC Driver 17 for SQL Server};'
    'SERVER=你的服务器名称;'
    'DATABASE=你的数据库名称;'
    'UID=你的用户名;'
    'PWD=你的密码'
)
# 创建引擎
engine = create_engine(f'mssql+pyodbc:///?odbc_connect={params}')

3. 显式指定列的数据类型,避免自动推断错误

有时候pandas自动推断的SQL类型可能和目标表不匹配,你可以在to_sql时通过dtype参数明确指定每一列对应的SQLAlchemy类型:

from sqlalchemy.types import Integer, Text

# 定义DataFrame列到SQL类型的映射
dtype_mapping = {
    'col1': Integer(),
    'col2': Text(),  # Text对应SQL Server的varchar(max)
    'col3': Text(),
    'col4': Text(),
    'col5': Text(),
    'col6': Text(),
    'col7': Integer(),
    'col8': Text(),
    'col9': Text(),
    'col10': Text()
}

# 执行上传
df.to_sql('table_name', con=engine, if_exists='replace', index=False, dtype=dtype_mapping)

按照这三个步骤来,基本就能解决这个类型不匹配的问题了。优先从第一步的字节转字符串开始排查,这是最常见的触发原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:53:11