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

Flask应用部署至Heroku后无法连接SQL Server数据库报错求助

问题描述

我正在为公司开发基于Flask框架构建的网页应用,该应用需要对接公司内部SQL Server数据库。我使用SQLAlchemy的create_engine()函数创建数据库连接,本地开发阶段所有功能运行正常,但将应用部署到Heroku后出现报错,耗费一整天排查仍未解决。当前Heroku上部署的应用非数据库相关功能均可正常运行,仅在尝试建立数据库连接时会触发故障。

我的数据库连接实现代码如下:

def connect(self):
        # 连接参数
        DRIVER_NAME = 'SQL SERVER'
        SERVER_NAME = 'SQLDATA'
        DATABASE_NAME = 'Rehab'

        # 连接配置
        connection_string = f"""
            DRIVER={{{DRIVER_NAME}}};
            SERVER={SERVER_NAME};
            DATABASE={DATABASE_NAME};
            Trust_Connection = yes;
            uid = ###########;  <--- 账号已隐藏,确认配置正确
            pwd = ##########;   <--- 密码已隐藏,确认配置正确
        """
   
        connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})
     
        engine = create_engine(connection_url)
        return engine

上述connect函数在本地环境运行时不会触发任何问题。

Heroku平台返回的报错日志如下:

2022-06-14T21:29:20.172377+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect
2022-06-14T21:29:20.172377+00:00 app[web.1]: return dialect.connect(*cargs, **cparams)
2022-06-14T21:29:20.172377+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 597, in connect
2022-06-14T21:29:20.172378+00:00 app[web.1]: return self.dbapi.connect(*cargs, **cparams)
2022-06-14T21:29:20.172378+00:00 app[web.1]: pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'SQL SERVER' : file not found (0) (SQLDriverConnect)")

问题根因

报错信息已经直接指向故障点:你的本地开发环境是Windows系统,系统自带名为SQL SERVER的ODBC驱动,因此本地运行无异常;但Heroku的运行环境是Ubuntu Linux,既没有预装Windows专属的SQL Server ODBC驱动,也无法识别SQL SERVER这个Windows平台专属的驱动名称,因此抛出找不到驱动文件的错误。

修复步骤
  • 第一步:为Heroku应用添加适配pyodbc连接SQL Server的构建包,部署时构建包会自动在Linux环境中安装官方版本的Microsoft SQL Server ODBC驱动。添加构建包时注意将该驱动构建包的加载顺序放在Python构建包之前,否则驱动不会被正确安装。
  • 第二步:修改代码中的驱动名称配置,Linux环境下微软官方ODBC驱动的名称为ODBC Driver 18 for SQL Server(如果后续部署提示找不到该驱动,可根据实际安装的版本调整为ODBC Driver 17 for SQL Server),将代码中DRIVER_NAME的赋值替换为对应驱动名即可:
    DRIVER_NAME = 'ODBC Driver 18 for SQL Server'
    
  • 第三步:确认网络连通性。你当前配置的数据库地址SQLDATA是公司内网地址,Heroku属于公网运行环境,默认无法直接访问公司内网资源。如果完成前两步操作后出现连接超时错误,需要联系公司IT部门开放数据库的公网访问权限,或配置专用网络通道让Heroku应用可以访问到内网数据库。

补充提示:如果修改驱动后部署触发SSL证书相关报错,在连接字符串中新增TrustServerCertificate=yes;配置即可。这是因为Linux版ODBC驱动默认会强制校验SQL Server的SSL证书,内网部署的SQL Server大多使用自签名证书,会被驱动默认拦截。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:03:29