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

pyodbc已识别ODBC驱动但连接Docker中SQL Server报错如何解决

故障根因

你的连接失败是多个配置错误共同导致的:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:16:01