连接Azure SQL时遭遇ODBC Driver 17错误,请求技术支持
sqlalchemy.exc.OperationalError: (pyodbc.OperationalError) ('08001',
'[08001] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: A
non-recoverable error occurred during a database lookup.\r\n (11003)
(SQLDriverConnect); [08001] [Microsoft][ODBC Driver 17 for SQL
Server]Login timeout expired (0); [08001] [Microsoft][ODBC Driver 17
for SQL Server]A network-related or instance-specific error has
occurred while establishing a connection to SQL Server. Server is not
found or not accessible. Check if instance name is correct and if SQL
Server is configured to allow remote connections. For more information
see SQL Server Books Online. (11003)')
可通过SQL Server Management Studio正常连接该Azure SQL服务器。
连接代码示例
from sqlalchemy import create_engine connection_string = "mssql+pyodbc://user:password@azuresqlserver.database.windows.net/mydatabase?driver=ODBC+Driver+17+for+SQL+Server" self.engine = create_engine(connection_string, pool_size=100, max_overflow=20) self.engine.connect()
已执行的排查步骤
- 本地机器已安装SQL Server 2019、ODBC Driver 17和18
- 将Python版本从3.11降级至3.9
- 本地Windows机器可通过SQL Server Management Studio连接服务器
- 使用VS Code部署至无服务器Azure Function,不支持Docker镜像
排查与解决建议
1. 修正连接字符串格式
Azure SQL要求加密连接,且Linux环境对连接字符串参数更敏感,尝试修改为标准格式:
connection_string = "mssql+pyodbc://user:password@azuresqlserver.database.windows.net:1433/mydatabase?driver=ODBC+Driver+17+for+SQL+Server&Encrypt=yes&TrustServerCertificate=no"
- 显式指定默认端口
1433,避免域名解析时的端口歧义 - 强制启用加密参数,匹配Azure SQL的连接要求
2. 检查Azure SQL防火墙规则
- 确认本地机器的公网IP已添加至Azure SQL服务器的防火墙允许列表
- 针对无服务器Azure Function,需在Azure门户的SQL服务器防火墙设置中开启「允许Azure服务和资源访问此服务器」选项
3. 适配Azure Function Linux环境的依赖
Azure Function Linux环境默认未预装ODBC驱动,需在requirements.txt中明确声明依赖:
sqlalchemy>=1.4.0 pyodbc>=4.0.30
同时在Function应用的配置中添加环境变量ODBCSYSINI=/etc,确保驱动路径被正确识别。
4. 处理密码中的特殊字符
如果密码包含@、&等URL特殊字符,需进行URL编码(例如@替换为%40),避免连接字符串解析错误。
5. 验证网络连通性
- 本地执行
telnet azuresqlserver.database.windows.net 1433或nc -zv azuresqlserver.database.windows.net 1433,确认端口可访问 - Azure Function中可添加简单的网络测试代码,验证域名解析及端口连通性
内容的提问来源于stack exchange,提问作者AsitK

