Docker环境下Django运行inspectdb连接SQL Server失败怎么解决?
问题排查及解决方案
核心原因1:依赖版本不兼容
你当前使用的pyodbc==3.0.10版本过于老旧,和django-mssql-backend==2.8.1存在兼容性问题,该版本的django-mssql-backend要求pyodbc最低版本为4.0.10以上。
解决方法:修改requirements.txt,替换pyodbc版本:
pyodbc>=4.0.30 django-mssql-backend==2.8.1
重新构建Docker镜像生效。
核心原因2:Django生成的连接参数有误
对比你手动拼接的可用连接字符串,Django侧的配置存在2处可优化点:
- TDS版本参数格式不标准,且未关闭加密校验:新版SQL Server默认要求加密连接,未配置加密参数会直接被拒绝连接
- FreeTDS的端口参数规范是直接拼接在HOST后(格式为
HOST,PORT),单独设置PORT字段部分场景下会被驱动识别失败
解决方法:修改settings.py的数据库配置:
DATABASES = { 'pirineos': { 'ENGINE': 'sql_server.pyodbc', 'NAME': DB_PIRINEOS_NAME, 'USER': DB_PIRINEOS_USER, 'PASSWORD': DB_PIRINEOS_PASSWORD, # 直接把端口拼到HOST后面,删掉单独的PORT字段 'HOST': f"{DB_PIRINEOS_HOST},{DB_PIRINEOS_PORT}", 'OPTIONS': { 'driver': 'FreeTDS', 'unicode_results': True, 'driver_supports_utf8' : True, # 修正参数大小写,新增加密跳过配置 'extra_params': 'TDS_Version=8.0;Encrypt=NO;TrustServerCertificate=YES;', }, }, }
辅助排查方法
如果修改后仍无法连接,可进入Docker容器内执行以下命令验证驱动层面的连通性:
# 替换为你实际的数据库地址、端口、用户名、密码 tsql -H <数据库地址> -p <端口> -U <用户名> -P <密码>
如果tsql命令连接失败,说明是FreeTDS驱动或网络层面的问题,优先排查数据库白名单、网络连通性、账号权限。
内容的提问来源于stack exchange,提问作者Alberto Sanmartin Martinez
相关产品推荐
相关产品推荐

