如何查看SQLAlchemy使用的具体驱动?PyInstaller编译后MSSQL连接超时如何解决?
查看SQLAlchemy实际调用的ODBC驱动方法
你可以通过逐层获取原生pyodbc连接对象,调用getinfo接口读取驱动的完整信息:
import pyodbc from sqlalchemy import create_engine engine = create_engine("mssql+pyodbc://USER:PASSWORD@SERVERIP/DB_NAME?driver=ODBC+Driver+17+for+SQL+Server") with engine.connect() as conn: # 提取最底层的pyodbc原生连接对象 raw_pyodbc_conn = conn.connection.connection # 获取驱动文件名 print("驱动文件名:", raw_pyodbc_conn.getinfo(pyodbc.SQL_DRIVER_NAME)) # 获取驱动dll完整路径 print("驱动完整路径:", raw_pyodbc_conn.getinfo(pyodbc.SQL_DRIVER_PATH)) # 获取驱动版本号 print("驱动版本:", raw_pyodbc_conn.getinfo(pyodbc.SQL_DRIVER_VER))
打包后连接超时的核心原因
- PyInstaller打包时默认不会集成系统级的ODBC驱动,也不会读取系统的ODBC配置项,所以你在交互式环境下能识别到的
ODBC Driver 17 for SQL Server,在exe运行的隔离临时环境中无法被识别,pyodbc.drivers()返回结果差异就是直接证明。 - 当pyodbc找不到你指定的驱动时,会fallback到默认的Named Pipes协议尝试连接,而多数SQL Server默认关闭Named Pipes协议,只开放TCP连接,最终触发连接超时报错。
- 部分情况下也可能是打包后环境的驱动名称和你连接字符串中写的名称不匹配,导致驱动加载失败。
解决建议
- 优先在连接字符串中强制指定TCP协议,避免走Named Pipes,同时延长连接超时时间,示例连接字符串如下:
mssql+pyodbc://USER:PASSWORD@SERVERIP/DB_NAME?driver=ODBC+Driver+17+for+SQL+Server&tcp:SERVERIP,1433&timeout=30 - 如果是驱动缺失问题,可手动将ODBC 17的相关dll打包进exe:先找到本地对应版本的驱动文件(64位系统默认路径为
C:\Windows\System32\msodbcsql17.dll、C:\Windows\System32\msodbcsqlr17.dll,32位程序对应C:\Windows\SysWOW64目录下的同名文件),再通过PyInstaller的--add-binary参数打包:pyinstaller --add-binary "C:\Windows\System32\msodbcsql17.dll;." --add-binary "C:\Windows\System32\msodbcsqlr17.dll;." your_script.py - 也可以直接在连接字符串中指定驱动dll的绝对路径,跳过驱动名称匹配步骤:
mssql+pyodbc://USER:PASSWORD@SERVERIP/DB_NAME?driver=C:\Windows\System32\msodbcsql17.dll
内容的提问来源于stack exchange,提问作者Brad Cooley
相关产品推荐
相关产品推荐

