Flask API中pyodbc连接SQL Server失败,独立脚本可正常运行
Flask中使用pyodbc连接SQL Server报Login Failed错误的解决办法
问题根源
你遇到的问题和Flask、pyodbc的兼容性无关,核心是运行身份的差异:
- 独立脚本运行时,是用当前登录的Windows用户身份通过
Trusted_Connection='yes'做Windows身份验证,该用户已被授权访问SQL Server,所以连接正常。 - Flask作为WSGI应用运行时,是用服务器进程的系统身份(比如Windows服务账户、IIS应用池账户,格式为
<domain>\<pc-name>$的计算机账户)尝试连接SQL Server,而这个账户没有被授予数据库登录权限,因此触发18456登录失败错误。
解决方案
1. 给服务器进程账户添加SQL Server权限
- 打开SQL Server Management Studio,展开「安全性」→「登录名」,右键选择「新建登录名」
- 在「登录名」输入框点击「搜索」,找到
<domain>\<pc-name>$这个计算机账户并添加 - 切换到「用户映射」标签,勾选目标数据库,分配
db_datareader、db_datawriter等必要权限
2. 修改Flask运行的身份为有权限的用户
- 如果是IIS部署:修改应用池的「标识」为拥有SQL Server访问权限的域账户或本地用户
- 如果是开发环境命令行运行:确保启动Flask的命令行窗口是用有权限的用户打开的(开发环境一般不会出现此问题,多发生在部署为服务时)
3. 改用SQL Server身份验证
放弃Windows身份验证,使用SQL Server专属账号密码连接,修改连接字符串如下:
conn = pyodbc.connect( Driver='{ODBC Driver 17 for SQL Server}', Server='localhost', Database='<db_name>', UID='<sql_username>', PWD='<sql_password>' )
注意:需先确保SQL Server已启用「混合身份验证模式」,且该SQL账号拥有目标数据库的访问权限。
内容的提问来源于stack exchange,提问作者kevinkesicki
相关产品推荐
相关产品推荐

