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

