Python新手用pymssql连接EFSPC14的SQLEXPRESS报20009错误求助
pymssql连接本地SQLEXPRESS实例报20009错误的排查方案
触发20009错误的核心原因是pymssql没有正确解析到SQLEXPRESS实例的实际监听地址,和SQL Server本身的服务状态、账号权限无关——SSMS能正常连接,说明服务本身处于正常运行状态。
问题本质说明
SQLEXPRESS属于命名实例,默认不会监听固定的1433端口,而是依赖Windows系统的SQL Browser服务自动告知连接方对应的端口号。SSMS作为官方客户端内置了SQL Browser的交互逻辑,能自动解析实例对应的端口;但pymssql默认不会自动解析带反斜杠的实例名字符串,直接把
EFSPC14\SQLEXPRESS当成完整的主机名去解析,最终只会定位到主机EFSPC14,找不到对应实例的TCP监听端口,就会抛出“Adaptive Server不可用”的错误。
可直接落地的修复步骤
- 先获取SQLEXPRESS的实际监听端口:打开SQL Server配置管理器,定位到SQLEXPRESS实例的网络配置,开启TCP/IP协议,在TCP/IP属性的IP地址栏找到所有IP段对应的TCP端口值。建议清空动态端口的默认配置,手动设置固定端口(比如1433),避免每次重启实例端口变动导致连接失败。
- 根据获取到的端口值修改连接代码,二选一即可:
- 显式指定端口的写法(兼容性最好,不受SQL Browser服务状态影响):
import pymssql mydbb = pymssql.connect( server='EFSPC14', # 本机连接也可以直接写'localhost' port=1433, # 替换成实际查到的SQLEXPRESS固定端口 user='sa', password='sa123', database='PythonAutomation' ) - 按实例名匹配的写法(pymssql 2.1.0以上版本支持):不要把实例名拼在server字段里,单独用instance参数传值,前提是SQL Browser服务处于运行状态、UDP1434端口未被拦截:
mydbb = pymssql.connect( server='EFSPC14', instance='SQLEXPRESS', user='sa', password='sa123', database='PythonAutomation' )
- 显式指定端口的写法(兼容性最好,不受SQL Browser服务状态影响):
- 排查防火墙拦截:如果改完代码还是无法连接,临时关闭Windows Defender防火墙测试一次。如果能连通,就在防火墙入站规则中放行Python程序和SQLEXPRESS实例的固定TCP端口即可。
- 后续验证点:连接通了之后如果出现登录失败的报错,再检查SQLEXPRESS的身份验证模式是否开启了SQL Server混合认证、sa账号是否被禁用、密码是否正确即可。
内容的提问来源于stack exchange,提问作者Tin
相关产品推荐
相关产品推荐

