Windows环境下Pyodbc连接SQL Server失败求助
问题概况
- 可通过SSMS 18正常登录SQL Server,但使用Pyodbc无法连接
- 已确认数据库处于运行状态,且已启用TCP/IP
- 尝试过用户名密码连接、Windows身份验证连接均失败
所用代码
server = 'DESKTOP-E111111\SQLEXPRESS' database = 'my_database' cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server}; \ SERVER=' + server + '; \ DATABASE=' + database + ';\ Trusted_Connection=yes;')
报错信息
File "e:/Users/willi/PycharmProjects/rf/new_robot_2022/insert_to_db.py", line 26, in
cnxn =pyodbc.connect('''DRIVER={ODBC Driver 17 for SQL Server};
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]MAX_PROVS: Error Locating Server/Instance Specified [xFFFFFFFF]. (-1) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0); [08001] [Microsoft][ODBC Driver 17 for SQL Server]Invalid connection string attribute (0); [08001] [Microsoft][ODBC Driver 17 for SQL Server]A network-related or
instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. (-1)')
解决步骤
1. 修正服务器名的转义问题
Python字符串中的反斜杠是转义符,'DESKTOP-E111111\SQLEXPRESS'里的\S会被错误转义,导致实例名识别失败。两种修正方式:
- 使用原始字符串:
server = r'DESKTOP-E111111\SQLEXPRESS' - 使用双反斜杠:
server = 'DESKTOP-E111111\\SQLEXPRESS'
2. 确认ODBC驱动版本匹配
检查系统已安装的ODBC驱动版本:
- 搜索并打开
odbcad32.exe(ODBC数据源管理器) - 切换到「驱动程序」标签,查看已安装的SQL Server驱动名称
- 确保代码中的
DRIVER={xxx}与实际安装的驱动名完全一致(比如如果装的是ODBC Driver 18,就改成{ODBC Driver 18 for SQL Server})
3. 验证并指定SQL Server实例端口
即使启用了TCP/IP,动态端口可能导致连接失败:
- 打开「SQL Server配置管理器」
- 展开「SQL Server网络配置」→「SQLEXPRESS的协议」,双击「TCP/IP」
- 切换到「IP地址」标签,找到「TCP端口」(如果是动态端口,查看「TCP动态端口」的数值)
- 在连接字符串中指定端口,格式为
SERVER=DESKTOP-E111111\SQLEXPRESS,xxxx(xxxx为端口号),或者直接用SERVER=DESKTOP-E111111,xxxx(省略实例名,仅适用于固定端口)
4. 检查Windows身份验证权限(若使用Trusted_Connection)
确保运行Python的Windows用户拥有SQL Server登录权限:
- 在SSMS中展开「安全性」→「登录名」,确认当前Windows用户已存在
- 右键用户→「属性」,检查「用户映射」是否勾选了
my_database数据库,并分配了合适的权限(比如db_datareader、db_datawriter)
5. 优化连接字符串构造方式
避免字符串拼接的语法错误,改用参数化或字典传参:
参数化字符串(f-string)
server = r'DESKTOP-E111111\SQLEXPRESS' database = 'my_database' conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes;' cnxn = pyodbc.connect(conn_str)
字典传参
cnxn = pyodbc.connect( driver='{ODBC Driver 17 for SQL Server}', server=r'DESKTOP-E111111\SQLEXPRESS', database='my_database', trusted_connection='yes' )
内容的提问来源于stack exchange,提问作者William

