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

pyodbc连接Docker中运行的SQL Server 2019报服务器不可访问错误

问题排查与修复方案

核心错误点

  • 连接字符串的Server参数填写错误:你填的cbbcb967dacb是Docker分配的容器内部ID,仅容器内部网络可解析,宿主机直接访问无法识别该地址,这是触发「服务器不可访问、命名管道连接失败」报错的核心原因。
  • 连接字符串存在语法错误与参数冲突:PWD=Password末尾漏写分号,直接拼接了Trusted_Connection=yes;该参数代表启用Windows系统身份验证,Docker运行的Linux版SQL Server不支持该认证方式,开启后会强制走本地命名管道查找实例,必然连接失败。
  • ODBC Driver 18默认强制TLS加密,本地测试环境的自签名证书不受信任,未加跳过证书校验的参数会导致连接阻断。
  • 代码中存在无效语句:无参数调用connector.execute()本身就会抛出运行错误,该行属于冗余代码需删除。
  • 更换为ODBC Driver 17时报错的原因是本地未安装对应版本驱动,无需更换驱动,使用已安装的18版本即可。

注:容器终端内可正常执行查询是因为操作发生在容器内部,通过本地套接字直接连数据库,不需要走宿主机到容器的网络链路,和你在宿主机跑Python脚本的网络场景完全不同,不代表连接参数配置正确。

前置检查

先确认容器端口映射配置正确,本地终端执行以下命令查看容器状态:

docker ps

找到对应SQL Server容器,确认PORTS列存在0.0.0.0:1433->1433/tcp的映射规则。如果没有该映射,删除现有容器后重新创建,启动命令必须加端口映射参数:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=你的符合复杂度要求的sa密码" -p 1433:1433 --name mssql2019 -d mcr.microsoft.com/mssql/server:2019-latest

注意:sa密码长度至少8位,需同时包含大小写字母、数字、特殊符号,否则容器会异常退出。

修正后的可运行代码

import pyodbc
conn_str = (
    "Driver={ODBC Driver 18 for SQL Server};"
    "Server=localhost,1433;"  # 宿主机访问映射端口用localhost+端口即可
    "Database=testdb;"
    "UID=sa;"
    "PWD=你设置的sa密码;"
    "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()

常见踩坑提醒

  • 不要将容器ID、容器内部主机名作为宿主机访问的服务地址,默认Docker桥接网络下,宿主机访问容器服务必须通过-p参数映射到宿主机的端口,使用localhost或127.0.0.1访问。
  • 非Windows环境连接SQL Server不要添加Trusted_Connection=yes参数,该参数仅支持Windows平台的系统身份认证,和SQL账号密码认证互斥。
  • 连接字符串的每个键值对末尾必须加分号分隔,漏写分号会导致参数解析错乱。
  • 报「数据源名找不到、无默认驱动」错误时,直接安装对应名称的ODBC驱动即可,本地安装了哪个版本就用对应版本的驱动名,不要随意切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:16:02