如何使用aioodbc库传递AAD AccessToken认证Azure SQL Server?
如何使用aioodbc库传递AAD AccessToken认证Azure SQL Server?
嘿,刚好我了解过这个情况,其实aioodbc作为pyodbc的异步封装,是支持传递Azure AD AccessToken来认证Azure SQL Server的,下面给你具体的实现方法和注意事项:
核心原理
aioodbc底层依赖pyodbc实现数据库连接,所以pyodbc支持的AccessToken认证方式,aioodbc同样可以复用,主要有两种常见的实现方式:
方式一:直接在连接字符串中指定AccessToken
这种方式比较直观,直接把AccessToken作为连接字符串的一部分:
import aioodbc async def connect_to_azure_sql(): # 替换成你实际获取到的有效AccessToken access_token = "your-valid-aad-access-token" # 构建连接字符串 conn_str = ( "DRIVER={ODBC Driver 18 for SQL Server};" "SERVER=your-sql-server-name.database.windows.net;" "DATABASE=your-database-name;" "AccessToken={};".format(access_token) ) # 建立异步连接 conn = await aioodbc.connect(dsn=conn_str) # 示例:执行简单查询 cursor = await conn.cursor() await cursor.execute("SELECT TOP 1 * FROM your-table-name") result = await cursor.fetchone() print("查询结果:", result) # 关闭资源 await cursor.close() await conn.close()
方式二:通过attrs_before参数传递AccessToken
这种方式利用pyodbc的连接属性常量来传递,需要注意将token转换为指定编码的字节:
import aioodbc from pyodbc import SQL_COPT_SS_ACCESS_TOKEN async def connect_with_attrs(): access_token = "your-valid-aad-access-token" # 必须将token转换为UTF-16LE编码的字节 token_bytes = access_token.encode("utf-16-le") conn = await aioodbc.connect( driver="{ODBC Driver 18 for SQL Server}", server="your-sql-server-name.database.windows.net", database="your-database-name", attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_bytes} ) # 后续操作同上,执行查询、关闭资源 cursor = await conn.cursor() await cursor.execute("SELECT 1") result = await cursor.fetchone() print(result) await cursor.close() await conn.close()
关键注意事项
- 确保使用ODBC Driver 17或18版本:旧版本的ODBC驱动不支持Azure AD AccessToken认证方式
- AccessToken需要具备对应权限:你的AAD令牌必须拥有目标Azure SQL数据库的访问权限(比如被分配
db_datareader、db_owner等角色) - 使用
attrs_before时的编码要求:必须将字符串形式的token编码为utf-16-le格式的字节,这是pyodbc规定的格式
备注:内容来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

