pyodbc已识别ODBC驱动但连接Docker中SQL Server报错如何解决
故障根因
你的连接失败是多个配置错误共同导致的:
- 服务器地址配置错误:你填写的
cbbcb967dacb是SQL Server容器的内部ID,仅能在同一Docker自定义网络内的容器之间解析,如果你在宿主机直接运行Python脚本,根本无法识别这个地址,自然无法建立连接。 - 连接串存在语法和逻辑错误:
- 同时配置了SQL账号密码(UID/PWD)和
Trusted_Connection=yes,后者是Windows域身份验证专用参数,依赖Windows系统的SSPI组件,在Linux/macOS/Docker环境下开启会强制走Named Pipes协议,正是报错信息里提到的命名管道提供程序加载失败的直接原因。 PWD=Working@2022末尾遗漏分号,字符串拼接后会把后续的Trusted_Connection=yes直接拼到密码字段里,导致密码读取错误。- ODBC Driver 18默认强制对连接加密,未配置信任服务器证书参数时会触发TLS握手失败。
- 同时配置了SQL账号密码(UID/PWD)和
- 代码存在无效调用:连接建立后直接调用无参数的
connector.execute(),本身就会因为缺少SQL语句抛出异常。
修复方案
- 先确认SQL Server容器端口映射
执行docker ps查看容器配置,确认启动时添加了-p 1433:1433参数(将容器内SQL Server默认的1433端口映射到宿主机1433端口),如果你自定义了宿主机映射端口,记好对应的端口号。 - 修正连接代码
如果你在宿主机运行Python脚本,Server字段填127.0.0.1,映射端口(默认1433端口可直接写127.0.0.1),删除Trusted_Connection=yes配置,补上缺失的分号,添加加密相关参数,删除无效的connector.execute()调用,参考代码如下:
import pyodbc # 如果你自定义了宿主机映射端口,把Server字段的端口替换成你自己设置的值,比如127.0.0.1,14330 conn_str = ( "Driver={ODBC Driver 18 for SQL Server};" "Server=127.0.0.1,1433;" "Database=testdb;" "UID=sa;" "PWD=Working@2022;" "Encrypt=yes;" "TrustServerCertificate=yes;" ) connector = pyodbc.connect(conn_str) cursor = connector.cursor() cursor.execute('SELECT * FROM inventory') for row in cursor: print(row) cursor.close() connector.close()
- 特殊场景适配
如果你的Python脚本本身也运行在Docker容器中,不要直接用SQL Server容器ID作为连接地址:- 两个容器加入同一个自定义Docker网络时,直接用SQL Server的容器名作为Server地址即可
- 也可以直接用Docker默认网桥网关地址(通常为
172.17.0.1)加宿主机映射端口连接
注意这种场景下同样不要开启Trusted_Connection参数。
- 启动状态校验
执行docker logs <你的SQL Server容器ID>查看容器日志,确认SQL Server已经完成初始化启动,没有因sa密码不符合强度要求(要求至少8位,同时包含大小写字母、数字、特殊符号)启动失败,你当前设置的密码Working@2022符合规则,一般不会触发该问题,但可以做二次确认。
内容的提问来源于stack exchange,提问作者user18495643
相关产品推荐
相关产品推荐

