如何通过Python使用Azure AD通用MFA认证连接SQL Server?
如何用Python通过Azure AD Universal with MFA认证连接SQL Server?
当然可以实现!我之前也碰到过一模一样的需求,用pyodbc就能完美解决——它支持Azure AD的交互式MFA认证,和你在Azure Data Studio里用的“Azure Active Directory - Universal with MFA support”是完全对应的。下面是具体的步骤和代码示例:
步骤1:准备依赖
首先确保安装了pyodbc,以及最新版的ODBC驱动(推荐ODBC Driver 18 for SQL Server,低版本可能不支持MFA认证):
pip install pyodbc
如果是Windows系统,Azure Data Studio通常已经自带了兼容的ODBC驱动,不用额外安装;如果是Linux/macOS,需要手动下载对应系统的驱动包。
步骤2:编写连接代码
核心是在连接字符串里指定Authentication=ActiveDirectoryInteractive,这个参数就是对应MFA通用认证的逻辑。直接把你Azure Data Studio里的凭据填进去就行:
import pyodbc # 替换成你自己的服务器和账户信息 server = "***.net" database = "target" username = "***.***@mycompany.com" # 构建连接字符串 conn_str = ( f"DRIVER={{ODBC Driver 18 for SQL Server}};" f"SERVER={server};" f"DATABASE={database};" f"UID={username};" "Authentication=ActiveDirectoryInteractive;" "Encrypt=yes;" ) # 建立连接——这里会自动弹出MFA验证窗口(比如Microsoft Authenticator弹窗、手机验证码) try: conn = pyodbc.connect(conn_str) print("连接成功!") # 测试执行查询,替换成你的测试表 cursor = conn.cursor() cursor.execute("SELECT TOP 5 * FROM your_table_name;") for row in cursor: print(row) finally: if conn: conn.close()
用SQLAlchemy的进阶方案
如果你习惯用SQLAlchemy来操作数据库,可以基于上面的连接字符串构建引擎:
from sqlalchemy import create_engine # 转义连接字符串里的特殊字符,避免URL解析报错 encoded_conn_str = conn_str.replace(";", "%3B").replace("=", "%3D") engine_url = f"mssql+pyodbc:///?odbc_connect={encoded_conn_str}" engine = create_engine(engine_url) # 测试连接 with engine.connect() as conn: result = conn.execute("SELECT @@VERSION;") print("SQL Server版本:", result.fetchone()[0])
一些实用提醒
- 这个方法是交互式认证,必须在有图形界面的环境下运行(比如本地电脑),因为会弹出MFA验证窗口;如果是无界面的服务器环境,可能需要改用服务主体或托管身份认证,那是另一种场景了。
- 不要把账户信息硬编码在代码里,建议用环境变量或者Azure Key Vault来存储敏感信息,比如:
import os username = os.getenv("AZURE_AD_USERNAME") server = os.getenv("SQL_SERVER_ADDRESS")
内容的提问来源于stack exchange,提问作者Ben Nicholl




