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

Azure Functions报错:无法打开'ODBC Driver 17 for SQL Server'库

解决Azure Functions中pyodbc无法找到ODBC Driver 17 for SQL Server的问题

问题场景

本地虚拟机中运行的Python脚本可正常连接并查询Azure VM托管的SQL Server,但部署到Azure Functions后出现错误:

('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")

脚本此前可正常运行,已将pyodbc加入requirements.txt文件。

解决方案

1. 修正连接字符串语法错误

你的连接字符串中存在语法错误:";'Trusted_Connection=yes;"多了一个单引号,这会导致驱动解析失败。修正后的连接字符串如下(同时优化了格式可读性):

conn_str = (
    f"Driver={{ODBC Driver 17 for SQL Server}};"
    f"Server={DatabaseServer};"
    f"Database={DatabaseName};"
    f"Trusted_Connection=yes;"
)

2. 检查Azure Functions运行时环境

  • Windows运行时:若之前正常现在失效,可能是Azure Functions运行时更新导致预安装的ODBC驱动丢失。可以尝试重启函数应用,或者切换到特定版本的运行时(比如Python 3.9,该版本环境中ODBC Driver 17的兼容性更稳定)。
  • Linux运行时:Azure Functions的Linux默认环境可能未预装完整的ODBC驱动依赖,需要手动安装:
    • 若使用消耗计划/弹性高级计划,可通过自定义启动命令添加安装步骤:
      在函数应用的配置中,设置启动命令为:
      apt-get update && apt-get install -y msodbcsql17 unixodbc-dev && python -m pip install -r requirements.txt
      
    • 若使用高级计划/专用计划,建议构建自定义Docker镜像,在Dockerfile中添加驱动安装步骤:
      FROM mcr.microsoft.com/azure-functions/python:4-python3.10
      RUN apt-get update && apt-get install -y msodbcsql17 unixodbc-dev
      COPY requirements.txt /
      RUN pip install -r requirements.txt
      COPY . /home/site/wwwroot
      

3. 锁定pyodbc版本兼容性

在requirements.txt中指定兼容的pyodbc版本,避免自动升级到不兼容的版本:

pyodbc>=4.0.30,<5.0

4. 调整身份验证方式(针对Linux运行时)

Linux环境下Trusted_Connection=yes(Windows身份验证)可能无法正常工作,因为缺少AD集成环境。建议改用:

  • SQL Server身份验证:在连接字符串中添加UID=用户名;PWD=密码;(注意将敏感信息存储在Azure Functions应用设置中,不要硬编码)。
  • 托管身份(MSI):为函数应用启用系统分配托管身份,授予其SQL Server的访问权限,连接字符串改为:
    conn_str = (
        f"Driver={{ODBC Driver 17 for SQL Server}};"
        f"Server={DatabaseServer};"
        f"Database={DatabaseName};"
        f"Authentication=ActiveDirectoryMsi;"
    )
    

修正后的完整脚本

import pyodbc

DatabaseServer = 'Server'
DatabaseName = 'databasename'
# 修正语法错误并优化格式
conn_str = (
    f"Driver={{ODBC Driver 17 for SQL Server}};"
    f"Server={DatabaseServer};"
    f"Database={DatabaseName};"
    f"Trusted_Connection=yes;"
)

try:
    # Connect to the SQL Server
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()

    # Execute the query
    cursor.execute("SELECT TOP 10 hmy FROM Table")

    # Fetch and print the results
    rows = cursor.fetchall()
    results_str = ""
    for row in rows:
        results_str += str(row) + "\n"

    # Close the cursor and connection
    cursor.close()
    conn.close()
    print("Connection to SQL Server Successful")

except pyodbc.Error as e:
    print(f"Error connecting to SQL Server {str(e)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:53:17