Python SQLAlchemy代码报错0xc0000135,求问所需.NET Framework版本
解决Python上传SQL Server时的0xc0000135崩溃问题
我之前帮同事排查过一模一样的问题,这个0xc0000135错误其实很好定位——它本质是运行时找不到必要的动态链接库(DLL),结合你的代码场景(用pyodbc作为SQLAlchemy的SQL Server驱动),问题肯定出在ODBC驱动、.NET Framework和Python环境的兼容性上。虽然你已经装了.NET 4.8,但还有几个关键点没排查到,下面给你一步步来:
先搞懂错误根源
0xc0000135对应的Windows错误是STATUS_DLL_NOT_FOUND,放到你的场景里,就是pyodbc在调用SQL Server驱动的时候,找不到它依赖的.NET组件。可能的情况包括:
- Python和pyodbc的32/64位架构不匹配
- 你装的pyodbc版本和Python3.7.3、.NET4.8不兼容
- ODBC驱动本身缺失或者版本不对
- .NET Framework安装不完整(哪怕显示装了4.8,也可能有组件损坏)
具体排查&修复步骤
1. 先确认pyodbc的版本和架构
SQLAlchemy 1.3.10对pyodbc的要求是>=3.0.0,但Python3.7.3得用对应架构的pyodbc才行:
- 打开命令行跑这个命令看pyodbc的信息:
看输出里的pip show pyodbcLocation路径,如果是Lib\site-packages就是32位,Lib64\site-packages是64位,得和你的Python版本一致(Python3.7.3可以用python --version看架构)。 - 如果架构不匹配,卸载重装对应版本:
pip uninstall pyodbc # 32位Python装32位pyodbc(选4.0.30是因为对3.7兼容性拉满) pip install pyodbc==4.0.30 --only-binary :all: --platform win32 # 64位Python装64位 pip install pyodbc==4.0.30 --only-binary :all: --platform win_amd64
2. 修复.NET Framework 4.8
有时候看似装了4.8,但其实组件有损坏:
- 打开控制面板→程序→程序和功能,找到
.NET Framework 4.8,右键点更改→修复 - 修复完一定要重启电脑,不然可能不生效
3. 检查ODBC驱动版本
pyodbc依赖SQL Server的ODBC驱动,得装对版本和架构:
- 打开对应架构的ODBC管理器:
- 32位:
C:\Windows\SysWOW64\odbcad32.exe - 64位:
C:\Windows\System32\odbcad32.exe
- 32位:
- 切换到驱动程序标签,看看有没有
ODBC Driver 17 for SQL Server或者SQL Server Native Client 11.0 - 如果没有,下载对应架构的驱动装上(推荐ODBC Driver 17,对新老SQL Server都兼容)
4. 修改SQLAlchemy的连接字符串
原来的连接字符串用的是SQL Server这个泛称驱动,容易出现匹配错误,改成明确的驱动名称:
# 替换你原来的create_engine代码 engine = sqlalchemy.create_engine( f"mssql+pyodbc://{dbname}?driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True )
注意:fast_executemany=True需要pyodbc>=4.0.17,所以刚才装的4.0.30完全符合要求。
5. 用极简代码测试排除数据问题
先别用你的真实DataFrame,跑一段极简测试代码,看看是环境问题还是数据问题:
import sqlalchemy import pandas as pd # 造个测试数据 df = pd.DataFrame({'test_id': [1, 2, 3], 'test_name': ['a', 'b', 'c']}) engine = sqlalchemy.create_engine( f"mssql+pyodbc://{dbname}?driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True ) # 尝试创建一个临时测试表 df.to_sql('temp_test_table', engine, if_exists='replace', index=False)
如果这段代码能跑通,说明问题出在你的原始DataFrame或者目标表结构上;如果还是报同样的错,那肯定是环境依赖没搞定,回到前面的步骤再检查一遍。
内容的提问来源于stack exchange,提问作者EricAtAIR
相关产品推荐
相关产品推荐

