是否可以在Ubuntu上使用Azure AD连接到使用sqlalchemy和Python的Azure SQL?

是否可以在Ubuntu上使用Azure AD连接到使用sqlalchemy和Python的Azure SQL?,ubuntu,sqlalchemy,azure-active-directory,azure-sql-database,azure-managed-identity,Ubuntu,Sqlalchemy,Azure Active Directory,Azure Sql Database,Azure Managed Identity,可以在Ubuntu上使用Azure AD连接到Azure SQL吗 也就是说,可以在Python中的sqlalchemy中使用trusted_connection=True # Creating engine engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes') 在Azure上,您可以创建一个具有托管标识的linux VM,该标识允许您使用Azure A

可以在Ubuntu上使用Azure AD连接到Azure SQL吗

也就是说,可以在Python中的sqlalchemy中使用trusted_connection=True

# Creating engine
engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes')
在Azure上,您可以创建一个具有托管标识的linux VM,该标识允许您使用Azure AD连接到Azure服务。在他们的文档中,我可以找到如何使用它连接到各种Azure服务,但是,我没有看到连接到Azure SQL数据库的示例

我能找到的最接近的东西是,它非常复杂。

这里有一个文档-,您需要使用MSI获取访问令牌,并使用该令牌调用Azure SQL

不过,从文档结构来看,该文档似乎是针对Windows虚拟机的,我不确定它是否适合Linux虚拟机,您可以试一试。如果不工作,则表示不支持Linux虚拟机


不幸的是,目前(2020年1月)使用托管标识的唯一可用选项是使用System.Data.SqlClient或Microsoft.Data.SqlClient中的.NET库。好消息是它们是跨平台的,因此您可以从Linux调用它们,但是为了弥补Python的不足,您需要从Python调用.NET库

首先开始在Linux上使用.NET核心运行时

关键是使用访问令牌创建连接字符串

var conn = (System.Data.SqlClient.SqlConnection)Database.GetDbConnection();
conn.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
请参见此处的完整教程

或者,您可以使用System.Data.SqlClient对象或新的跨平台Microsoft.Data.SqlClient来实现类似的功能

详细编写“创建SQL连接字符串”
$conn=新对象System.Data.SqlClient.SQLConnection
$DatabaseName='Master'
$conn.ConnectionString=“数据源=$SQLServerName.database.windows.net;初始目录=$DatabaseName;连接超时=30”
$conn.AccessToken=$($SPNToken)
$conn
编写详细的“连接到数据库并执行SQL脚本”
$conn.Open()
$query='选择@@version'
$command=New Object-TypeName System.Data.SqlClient.SqlCommand($query,$conn)
$Result=$command.ExecuteScalar()
$Result
$conn.Close()
上面的示例使用的是跨平台的.NET核心库。要从Python调用它们,可以尝试使用pythonnet库


谢谢您的推荐。我已经阅读了Azure文档,我只找到了您参考中针对windows虚拟机的解决方案。我发现在Azure中使用托管索引的唯一解决方案是连接到Azure存储帐户。谢谢你的建议。看起来您是用Java编写的,而我正在寻找Python的解决方案。据我所知,您可以通过对服务器的rest调用获得一个访问令牌,然后使用该令牌使用Java中的一些Sql包进行调用。在python中使用SQL包也可以吗?抱歉,我错过了关于python的部分。上面的代码示例使用的是跨平台PowerShell核心库和.Net核心库。我没有尝试过这个方法,但我相信一个前进的方向是使用Python for.NET库。嘿,Merill,我会给你50分,但由于这是一个解决办法,必须在Java和Python之间来回转换数据才能工作,我不会接受这个问题的答案。谢谢!希望我们能尽快找到更好的方法。