Python脚本连接Azure SQL Database失败,认证参数报错求助
问题排查与解决方案
核心问题分析
报错Invalid value specified for connection string attribute 'Authentication'的主要原因是ODBC Driver 17 for SQL Server的版本不支持ActiveDirectoryAccessToken参数,同时数据库名称包含特殊字符也可能加剧解析错误。
具体修复步骤
1. 升级ODBC Driver版本
ODBC Driver 17 for SQL Server需升级至17.6及以上版本才支持ActiveDirectoryAccessToken认证方式,更推荐直接使用最新的ODBC Driver 18:
# 修改driver参数 driver = '{ODBC Driver 18 for SQL Server}'
注:Driver 18默认强制加密连接,若服务器配置特殊,可在连接字符串中添加
Encrypt=Optional;(生产环境不建议)。
2. 转义包含特殊字符的数据库名称
你的数据库名称legacy (conosur/legacy)包含空格和括号,需用双引号包裹避免解析错误:
# 修改连接字符串中的DATABASE字段 f'DATABASE="{database}";'
3. 验证连接字符串格式
确保每个键值对末尾带分号,无多余空格。可在pyodbc.connect前打印连接字符串确认格式:
print(connection_string)
4. 确认令牌有效性
虽然已完成浏览器认证,仍可通过jwt.io解码令牌,检查受众(audience)是否为https://database.windows.net/,且包含SQL相关权限。
修正后的完整脚本
import pyodbc import pandas as pd from azure.identity import InteractiveBrowserCredential # Azure SQL Database连接参数 server = 'conosur.database.windows.net' database = 'legacy (conosur/legacy)' driver = '{ODBC Driver 18 for SQL Server}' # 配置Azure AD凭据 credential = InteractiveBrowserCredential() # 获取Azure AD令牌 token = credential.get_token('https://database.windows.net/.default') # 构建正确的连接字符串 connection_string = ( f'DRIVER={driver};' f'SERVER={server};' f'DATABASE="{database}";' f'Authentication=ActiveDirectoryAccessToken;' f'ACCESS_TOKEN={token.token};' f'Encrypt=Required;' ) try: connection = pyodbc.connect(connection_string) print("连接成功建立") except pyodbc.Error as ex: sqlstate = ex.args[0] print(f"连接SQL Server出错: {sqlstate}") print(f"详细错误: {ex}") exit() # 执行查询 query = 'SELECT * FROM your_table_name' try: df = pd.read_sql(query, connection) print("DataFrame创建成功") except Exception as e: print(f"执行查询出错: {e}") finally: connection.close() # 展示数据 print(df.head())
内容的提问来源于stack exchange,提问作者SaiVermilion
相关产品推荐
相关产品推荐

