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

Linux环境Azure Functions部署时pyodbc模块缺失问题求助

解决方案

一、确保pyodbc依赖正确安装

  • 在Python函数项目根目录的requirements.txt中添加pyodbc==4.0.39(选择稳定兼容版本)。
  • 在Azure DevOps非YAML管道中添加Python任务,指定与函数运行时匹配的Python版本,执行命令:
pip install -r requirements.txt --no-binary :all:

使用--no-binary :all:强制源码编译,避免预编译包与Linux函数环境不兼容。

二、通过管道部署ODBC 17驱动(Linux环境)

添加两个Bash任务到管道中,完成驱动安装和配置:

任务1:安装ODBC驱动依赖和驱动本身

执行以下命令:

# 更新包列表并安装基础依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https unixodbc unixodbc-dev

# 添加微软官方源
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/debian/10/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

# 安装ODBC 17驱动
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17

注:若函数托管环境为其他Linux发行版,需调整对应源地址和安装命令。

任务2:配置ODBC驱动识别文件

执行命令生成/更新系统ODBC配置:

# 写入ODBC驱动配置到系统文件
echo "[ODBC Driver 17 for SQL Server]" | sudo tee -a /etc/odbcinst.ini
echo "Description=Microsoft ODBC Driver 17 for SQL Server" | sudo tee -a /etc/odbcinst.ini
echo "Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1" | sudo tee -a /etc/odbcinst.ini
echo "UsageCount=1" | sudo tee -a /etc/odbcinst.ini

若驱动版本不同,可在安装任务后添加find /opt/microsoft -name "libmsodbcsql*.so"命令确认驱动文件路径,替换上述Driver=后的内容。

三、优化身份连接代码

确保代码导入必要模块,并增加异常捕获便于调试:

'''Connect to Azure SQL DB'''
import pyodbc
import struct
from azure.identity import DefaultAzureCredential

def get_db_connection():
    try:
        credential = DefaultAzureCredential() # 使用系统分配托管身份
        # 获取SQL数据库令牌并转换为SQL驱动要求的UTF-16-LE格式
        token = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
        token_struct = struct.pack(f'<I{len(token)}s', len(token), token)
        # 令牌方式连接数据库
        SQL_COPT_SS_ACCESS_TOKEN = 1256
        conn_string = f"Driver={{ODBC Driver 17 for SQL Server}};SERVER=sql-to-dev-qasecgate.database.windows.net;DATABASE=QASecurityGatepoc"
        database_conn = pyodbc.connect(conn_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})            
        database_cursor = database_conn.cursor()
        return database_conn, database_cursor
    except Exception as e:
        print(f"数据库连接错误: {str(e)}")
        raise

四、管道任务执行顺序

确保管道任务按以下顺序排列:

  • 代码拉取(Git任务)
  • Python依赖安装
  • ODBC驱动安装(Bash任务)
  • ODBC配置文件写入(Bash任务)
  • 部署到Azure Functions任务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:03:15