据我所知,您的所有需求都在官方文档Using Azure Active Directory with the ODBC Driver 中。
首先,如果您想通过pyodbc 连接到 Azure SQL 数据库,只有 MS SQL Server 的 odbc 驱动程序 17 版本支持 Active Directory 集成身份验证。所以请确保您已经安装了最新的 SQL Server odbc 驱动程序,或者您可以从https://docs.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server?view=sql-server-2017 下载。
其次,请按照UI Additions for Azure Active Directory (Windows driver only) 部分配置 Azure Active Directory 集成身份验证到 SQL Azure 的 DSN。
然后,您可以按照下面的代码通过SQL Alchemy 和pyodbc 连接到SQL Azure。
from urllib import parse
from sqlalchemy import create_engine
connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:<your sql azure server name>.database.windows.net,1433;Database=<your database name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryIntegrated'
params = parse.quote_plus(connecting_string)
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
result = connection.execute("select 1+1 as res")
for row in result:
print("res:", row['res'])
connection.close()
注意:以上连接字符串的值,可以从Azure门户的``选项卡中复制,但请注意更改odbc驱动版本,去掉UID和PWD选项。
使用 Windows Integrated 或 Active Directory Integrated 进行连接
(仅限 Windows 驱动程序)身份验证,指定
Authentication=ActiveDirectoryIntegrated 在连接字符串中。这
驱动程序将自动选择正确的身份验证模式。 UID
和 PWD 不得指定。
或者你可以考虑使用Authentication=ActiveDirectoryPassword,它比Authentication=ActiveDirectoryIntegrated更简单,代码如下。
from urllib import parse
from sqlalchemy import create_engine
your_user_name = '<your AAD user or configured in SQL Azure Server as the figure below>'
your_password_here = '<your AAD account password>'
#connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:sqlserverleon.database.windows.net,1433;Database=dbleon;Uid='+your_user_name+';Pwd='+your_password_here+';Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryPassword'
connecting_string = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:sqlserverleon.database.windows.net,1433;Database=dbleon;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=ActiveDirectoryIntegrated'
params = parse.quote_plus(connecting_string)
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
result = connection.execute("select 1+1 as res")
for row in result:
print("res:", row['res'])
connection.close()
希望对你有帮助。