SQLAlchemy+pyodbc连接本地MSSQL实例报错10061求助
看到你用SSMS能正常连接数据库,但代码却报10061「目标机器主动拒绝连接」的错误,核心原因几乎肯定是连接字符串的端口/实例配置不对,或者SQL Server的网络服务没正确配置——毕竟SSMS能连说明账号、数据库本身没问题,我们一步步排查:
1. 先确认SQL Server Express的实际监听端口
SQL Server Express默认是命名实例,并且使用动态端口(不是固定的1433,除非你手动修改过)。你在连接字符串里硬写:1433,大概率是端口不匹配导致被拒绝。
查端口的两种简单方法:
- 方法一:用SSMS查询:连接到你的SQLEXPRESS实例,执行这条SQL:
结果就是当前实例正在监听的端口(比如可能是SELECT local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID;51234这类随机数)。 - 方法二:用SQL Server配置管理器:
打开「SQL Server配置管理器」→ 展开「SQL Server网络配置」→ 选择「SQLEXPRESS的协议」→ 右键「TCP/IP」→ 「属性」→ 切换到「IP地址」标签,拉到最底部的「IPAll」,查看「TCP动态端口」的值。
2. 调整连接字符串
根据上面查到的端口,有两种修改方式:
方式A:用实例名连接(依赖SQL Browser服务)
去掉连接字符串里的:1433端口指定,因为命名实例需要SQL Browser服务来解析实例名到对应端口。正确的字符串应该是:
engine = create_engine( "mssql+pyodbc://TestUser:TestUserPass@DESKTOP-QLSOTTG\\SQLEXPRESS/TestDB?driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True )
⚠️ 注意:这里的实例名SQLEXPRESS前面需要双反斜杠(URL转义),或者你也可以用原始字符串r""来避免转义:
engine = create_engine( r"mssql+pyodbc://TestUser:TestUserPass@DESKTOP-QLSOTTG\SQLEXPRESS/TestDB?driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True )
方式B:用固定端口连接
如果你查到的动态端口是比如51234,就把连接字符串里的1433换成这个端口:
engine = create_engine( "mssql+pyodbc://TestUser:TestUserPass@DESKTOP-QLSOTTG:51234/TestDB?driver=ODBC+Driver+17+for+SQL+Server", fast_executemany=True )
这种方式不需要依赖SQL Browser服务,但如果SQL Server重启后端口变化,你得重新更新端口号。
3. 确保必要的服务处于运行状态
- SQL Server Browser服务:如果你用方式A(实例名连接),必须确保这个服务是启动的。打开「服务」(按Win+R输入
services.msc),找到「SQL Server Browser」,设置为「自动」并启动它。 - SQL Server (SQLEXPRESS)服务:这个不用多说,确保它在运行(SSMS能连的话这个应该没问题,但还是确认下更稳妥)。
4. 验证TCP/IP协议已启用
在「SQL Server配置管理器」里,确认「SQLEXPRESS的协议」下的「TCP/IP」是启用状态。如果之前是禁用的,启用后需要重启SQL Server (SQLEXPRESS)服务。
5. 先测试基础连接(排除pandas干扰)
先不要用pandas写入,先测试最基础的SQLAlchemy连接是否成功,避免pandas的代码掩盖问题:
from sqlalchemy import create_engine # 用你调整后的连接字符串 engine = create_engine(r"mssql+pyodbc://TestUser:TestUserPass@DESKTOP-QLSOTTG\SQLEXPRESS/TestDB?driver=ODBC+Driver+17+for+SQL+Server") try: with engine.connect() as conn: result = conn.execute("SELECT 1 AS test") print("连接成功!测试结果:", result.fetchone()) except Exception as e: print("连接失败:", str(e))
最后补充:驱动版本建议
尽量用最新的ODBC驱动(比如ODBC Driver 17 for SQL Server),旧版本可能有兼容性问题,你之前注释的那个驱动17的字符串是对的,优先用它。
内容的提问来源于stack exchange,提问作者anakaine

