You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyodbc本地连接SQL Server失败但远程连接正常的问题求助

问题描述

以下pyodbc代码在远程计算机上可正常连接SQL Server数据库:

import pyodbc

server = 'xxx.xx.xx.xxx'
database = 'Stackoverflow'
username = 'sa'
password = 'azeqsd789456'
connection_string = f'DRIVER={{ODBC Driver 11 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'

try:
    connection = pyodbc.connect(connection_string)
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM testforms")
    for row in cursor:
        print(row)
    cursor.close()
    connection.close()
except Exception as e:
    print(f"An error occurred: {e}")

但将代码部署到数据库所在的本地机器时,连接持续失败,报错如下:

Failed to connect to the database. Error: (pyodbc.OperationalError)
('08001', '[08001] [Microsoft][ODBC Driver 11 for SQL Server]SQL
Server Network Interfaces: Error Locating Server/Instance Specified
[xFFFFFFFF]. (-1) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver
11 for SQL Serve r]Login timeout expired (0); [08001] [Microsoft][ODBC
Driver 11 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)')

尝试过以下server参数(均能在SQL Server Management Studio中正常连接,但Python连接失败):

  • localhost
  • (local),1433
  • (local)
  • 带/不带SQLEXPRESS的实际实例名称
  • 远程连接时使用的同一IP

同时还遇到相关问题:使用类似代码连接时,返回错误“data source name not found and no default driver specified (0) (sqldriverconnect)”,但调用pyodbc.drivers()能查到对应ODBC驱动。

解决方案

1. 检查Python与ODBC驱动的位数匹配

Python的位数(32/64位)必须与安装的ODBC驱动、SQL Server的位数完全一致,否则即使pyodbc.drivers()能查到驱动,实际连接也会失败:

  • 查看Python位数:运行代码 import sys; print(sys.maxsize > 2**32),返回True为64位,False为32位。
  • 打开对应位数的ODBC数据源管理器:
    • 64位:控制面板→管理工具→ODBC数据源(64位)
    • 32位:运行C:\Windows\SysWOW64\odbcad32.exe
  • 确认对应版本的ODBC Driver 11(或更高版本)存在。

2. 调整连接字符串写法

尝试以下几种连接字符串格式,强制指定连接协议或修正实例路径:

  • 强制TCP/IP连接:
    # 默认实例,指定端口
    connection_string = f'DRIVER={{ODBC Driver 11 for SQL Server}};SERVER=tcp:localhost,1433;DATABASE={database};UID={username};PWD={password}'
    # 或用127.0.0.1
    connection_string = f'DRIVER={{ODBC Driver 11 for SQL Server}};SERVER=tcp:127.0.0.1,1433;DATABASE={database};UID={username};PWD={password}'
    
  • 使用命名管道协议(适用于本地实例):
    # 默认实例
    connection_string = f'DRIVER={{ODBC Driver 11 for SQL Server}};SERVER=np:\\.\pipe\sql\query;DATABASE={database};UID={username};PWD={password}'
    # SQLEXPRESS实例
    connection_string = f'DRIVER={{ODBC Driver 11 for SQL Server}};SERVER=np:\\.\pipe\MSSQL$SQLEXPRESS\sql\query;DATABASE={database};UID={username};PWD={password}'
    
  • 升级ODBC驱动版本:如果Driver 11兼容性差,换成Driver 17或18,修改连接字符串中的驱动名即可,比如DRIVER={ODBC Driver 17 for SQL Server}。

3. 验证SQL Server本地连接配置

打开SQL Server配置管理器,检查以下项:

  • 确认SQL Server服务处于运行状态。
  • 进入SQL Server网络配置→你的实例名的协议,确保TCP/IP和命名管道均已启用。
  • 双击TCP/IP,在IP地址选项卡中,确认IP1(127.0.0.1)的已启用为是,TCP端口为1433。
  • 确认SQL Server允许SQL Server身份验证:打开SSMS,右键服务器→属性→安全性,选择SQL Server和Windows身份验证模式。

4. 通过ODBC DSN测试连接

创建系统DSN排除连接字符串格式问题:

  1. 打开对应位数的ODBC数据源管理器,切换到系统DSN选项卡,点击添加。
  2. 选择对应ODBC驱动,输入数据源名称,填写服务器名、数据库、sa账号密码,点击测试连接。
  3. 若测试成功,直接用DSN写连接字符串:
    connection_string = 'DSN=你的DSN名称;UID=sa;PWD=azeqsd789456'
    

5. 检查权限与防火墙

  • 尝试用管理员身份运行Python脚本,避免本地进程权限限制。
  • 临时关闭Windows防火墙测试连接,若成功则添加允许SQL Server端口(1433)的入站规则。

内容的提问来源于stack exchange,提问作者Siqueler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:53:28