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
相关产品推荐
相关产品推荐

