Python导入Excel到SQL Server报OperationalError(08S01)信号量超时如何解决
排查解决步骤
1 网络连通性排查
- 先验证基础网络可达性:在代码运行设备上执行
ping 你的SQL Server域名,确认无丢包、延迟低于200ms;再执行telnet 你的SQL Server域名 1433(默认SQL Server端口,自定义端口替换为对应值)确认端口连通。如果端口不通,先联系网络管理员放行防火墙、安全组规则。 - 确认网络无拦截策略:检查当前设备是否挂了代理、VPN,企业内网的WAF、防火墙是否限制了大数据量的数据库传输,很多网络策略会拦截超过阈值的单请求数据包,导致链路中断。
2 连接参数调优
你当前的连接字符串未配置超时参数,新增超时配置避免长时间等待被链路中断:
# 新增Connect Timeout(连接建立超时)、Command Timeout(SQL执行超时,单位秒) conn='DRIVER={SQL Server Native Client 11.0};SERVER=*********.net;DATABASE=*****;UID=****;PWD=*****;Connect Timeout=60;Command Timeout=300' params = urllib.parse.quote_plus(conn) engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params),fast_executemany=True)
如果数据传输较慢可以继续调高Command Timeout的数值。
3 to_sql导入参数优化
你当前的df.to_sql缺少必要参数,也没有做批次拆分,单次提交全量7000行数据很容易触发超时,调整为如下写法:
df.to_sql( name='table_name', con=engine, if_exists='append', # 覆盖写入改为'replace',根据实际需求调整 index=False, # 不需要写入pandas索引可设为False,减少无效数据传输 chunksize=100 # 每100行做一次批量提交,降低单次请求大小,可根据测试结果调整为50/200等值 )
4 数据与兼容性测试
- 先做小数据量验证:取前10行测试导入
df.head(10).to_sql(...),如果小数据导入成功、全量失败,基本可确定是单次传输量过大的问题,继续调小chunksize即可。 - 检查数据中是否存在超长字符串、二进制大字段,这类字段会大幅提升单条数据大小,如有可以单独处理这类字段,或进一步降低批次提交的行数。
- 驱动兼容性检查:如果Native Client 11.0驱动和SQL Server服务端版本不兼容,可以替换为更新的
ODBC Driver 17 for SQL Server,将连接字符串中DRIVER的值改为{ODBC Driver 17 for SQL Server}即可,使用前需先在本机安装对应驱动。 - 依赖版本升级:将相关依赖升级到最新稳定版再测试,执行命令:
pip install --upgrade pyodbc sqlalchemy pandas
内容的提问来源于stack exchange,提问作者Talha Tayyab
相关产品推荐
相关产品推荐

