使用YAML参数在Python中连接SQL Server数据库失败求助
SQL Server连接失败(ODBC驱动未找到)排查与修复
问题场景
通过Python脚本读取YAML配置(包含hostname、database_name等参数)构建连接字符串,调用pyodbc.connect()时抛出错误:
InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
但命令提示符中可正常连接SQL Server。
核心原因
Python脚本的连接字符串未指定正确的ODBC驱动版本/名称,或驱动与Python进程位数不匹配;而命令提示符中使用的连接工具(如sqlcmd)默认加载了正确驱动,因此可以正常连接。
排查步骤
- 确认本地已安装的SQL Server ODBC驱动:
打开ODBC数据源管理器(32位执行odbcad32.exe,64位执行C:\Windows\System32\odbcad32.exe),在「驱动程序」标签中找到类似ODBC Driver 17 for SQL Server的条目,记录完整驱动名称。 - 匹配Python进程与驱动位数:
64位Python必须搭配64位驱动,32位Python必须搭配32位驱动,位数不匹配会直接触发该错误。 - 检查YAML配置与连接字符串模板:
确认连接字符串中是否遗漏了Driver=参数,或驱动名称拼写错误。
修复示例
- 修改
test.yaml,补充驱动参数:
hostname: your_server_host database_name: target_db driver: "ODBC Driver 17 for SQL Server"
- 在
extract.py中完善连接字符串构建逻辑:
import yaml import pyodbc # 读取YAML配置 with open('test.yaml', 'r', encoding='utf-8') as f: config = yaml.safe_load(f) # 构建带驱动的连接字符串(注意驱动名称用大括号包裹,避免特殊字符解析问题) conn_str = ( f"DRIVER={{{config['driver']}}};SERVER={config['hostname']};" f"DATABASE={config['database_name']};Trusted_Connection=yes;" ) # 若使用SQL Server身份验证,替换为: # conn_str = ( # f"DRIVER={{{config['driver']}}};SERVER={config['hostname']};" # f"DATABASE={config['database_name']};UID={config['username']};PWD={config['password']};" # ) # 建立连接 conn = pyodbc.connect(conn_str)
额外注意事项
- 驱动名称必须与ODBC管理器中显示的完全一致,版本号(如17、13)不可写错。
- 若使用Windows身份验证,确保运行Python脚本的用户拥有SQL Server访问权限。
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

