能否在Ubuntu上通过Azure AD结合SQLAlchemy连接Azure SQL数据库?
回答:Ubuntu上通过Azure AD连接Azure SQL + SQLAlchemy的解决方案
先直接回应你的两个核心问题:
- 完全可以在Ubuntu系统上借助Azure AD连接Azure SQL数据库
trusted_connection=True这个参数在Linux环境下不适用——它是Windows集成认证(SSPI)的专用参数,Ubuntu没有对应的底层机制,得用Azure AD专属的认证方式,比如你提到的托管标识。
下面详细讲基于托管标识的具体实现步骤:
前提准备
- 确保你的Ubuntu VM已经启用了系统分配的托管标识
- 给这个托管标识授予Azure SQL数据库的访问权限:可以在Azure SQL的IAM面板中添加
SQL DB Contributor角色,或者直接在数据库内创建对应用户并赋权(示例SQL语句:CREATE USER [你的VM托管标识名称] FROM EXTERNAL PROVIDER; GRANT SELECT ON SCHEMA::dbo TO [你的VM托管标识名称];) - 安装必要的依赖工具和Python包:
sudo apt-get install unixodbc-dev pip install sqlalchemy pyodbc azure-identity
代码实现(基于托管标识获取认证令牌)
你需要通过Azure Identity库获取Azure SQL专属的访问令牌,再用这个令牌作为凭证完成数据库连接:
import sqlalchemy from azure.identity import ManagedIdentityCredential import pyodbc # 1. 获取Azure AD访问令牌(目标资源为Azure SQL服务) credential = ManagedIdentityCredential() token = credential.get_token("https://database.windows.net/.default") # 2. 构造ODBC连接字符串 server = "你的服务器名称.database.windows.net" database = "你的数据库名称" conn_str = f""" DRIVER={{ODBC Driver 18 for SQL Server}}; SERVER={server}; DATABASE={database}; UID=任意字符串; # Azure AD令牌认证时UID可以填任意值 PWD={token.token}; Authentication=ActiveDirectoryPassword; Encrypt=yes; TrustServerCertificate=no; """ # 3. 用SQLAlchemy创建数据库引擎 engine = sqlalchemy.create_engine(f"mssql+pyodbc:///?odbc_connect={conn_str}") # 测试连接是否正常 with engine.connect() as conn: result = conn.execute(sqlalchemy.text("SELECT @@VERSION")) print(result.fetchone())
关键说明
- 关于
trusted_connection:这个参数依赖Windows的安全支持提供程序接口(SSPI),Linux系统没有该组件,因此无法生效,必须替换为Azure AD的认证逻辑。 - 托管标识的优势在于不需要硬编码任何密码或密钥,令牌会自动轮换,安全性更高。
- 请确保安装的ODBC驱动是17版本及以上,旧版本可能不支持Azure AD认证功能。
内容的提问来源于stack exchange,提问作者Esben Eickhardt
相关产品推荐
相关产品推荐

