使用pyodbc连接SQL Server时报IM002错误该如何修正?
这个IM002报错的根本原因是ODBC驱动管理器无法识别你连接字符串中指定的驱动,同时你的连接字符串本身也存在多处语法错误,修正方案如下:
已存在的错误点
- 连接字符串的键值对等号两侧不能加多余空格,
Driver ={xxx}的写法不符合pyodbc的格式要求 - 字符串拼接逻辑混乱,
Server = ('my server name;多了多余左括号,Database ='my database name;引号位置错误,将固定字符串和参数变量的写法混写 - SQL Server Native Client系列驱动早已停止官方维护,高版本SQL Server适配性差,很可能你本机根本没有安装19.0版本的Native Client驱动
修正步骤
1. 先查询本机可用的SQL Server驱动
运行以下代码直接获取当前系统适配的驱动名称,不要手动臆写:
import pyodbc print([driver for driver in pyodbc.drivers() if 'SQL Server' in driver])
运行后会输出类似['ODBC Driver 17 for SQL Server', 'ODBC Driver 18 for SQL Server']的结果,直接使用输出列表里的驱动名称即可。
2. 修正连接字符串语法
如果直接写死连接参数,参考示例:
conn = pyodbc.connect( 'Driver={ODBC Driver 17 for SQL Server};' # 替换为上一步查到的驱动名称 'Server=你的服务器地址;' # 本地默认实例可写localhost,命名实例写.\实例名,远程实例写IP,端口号 'Database=你的数据库名称;' 'Trusted_Connection=yes;' # ODBC Driver 18及以上版本默认开启SSL校验,本地测试无证书的话补充下面这行 'Encrypt=no;' )
如果需要把服务器、数据库名称作为变量传入,用f-string写法:
server_name = "你的服务器名" db_name = "你的数据库名" driver_name = "你查到的驱动名" conn = pyodbc.connect( f'Driver={driver_name};' f'Server={server_name};' f'Database={db_name};' f'Trusted_Connection=yes;' f'Encrypt=no;' )
3. 位数匹配校验
如果修正后还是报同样错误,检查Python和ODBC驱动的位数是否一致:32位Python只能识别32位ODBC驱动,64位Python必须对应64位ODBC驱动,位数不匹配也会出现驱动找不到的问题。
内容的提问来源于stack exchange,提问作者PChao
相关产品推荐
相关产品推荐

