【问题标题】:Is it possible to use Azure AD on Ubuntu for connecting to Azure SQL using sqlalchemy and Python?是否可以在 Ubuntu 上使用 Azure AD 使用 sqlalchemy 和 Python 连接到 Azure SQL?
【发布时间】:2019-12-19 14:21:25
【问题描述】:

是否可以在 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 服务。在他们的文档中,我可以找到 examples 如何使用它连接到各种 Azure 服务,但是,我没有看到连接到 Azure SQL 数据库的示例。

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

【问题讨论】:

    标签: ubuntu sqlalchemy azure-active-directory azure-sql-database azure-managed-identity


    【解决方案1】:

    这是一个文档 - Tutorial: Use a Windows VM system-assigned managed identity to access Azure SQL,您需要通过 MSI 获取访问令牌并使用该令牌调用 Azure SQL。

    但是,从文档结构来看,该文档似乎是针对 Windows VM 的,我不确定它是否适合 Linux VM,您可以尝试一下。如果不行,说明不支持Linux VM。

    【讨论】:

    • 感谢您的参考。我已经查看了 Azure 文档,我只找到了您参考中的 windows VM 解决方案。我发现在 Azure 中使用 Managed Indetities 的唯一解决方案是连接到 Azure 存储帐户。
    【解决方案2】:

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

    首先开始在 Linux 上使用 .NET Core 运行时。

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

    var conn = (System.Data.SqlClient.SqlConnection)Database.GetDbConnection();
    conn.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;
    

    在此处查看完整教程https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

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

    Write-Verbose "Create SQL connectionstring"
    $conn = New-Object System.Data.SqlClient.SQLConnection 
    $DatabaseName = 'Master'
    $conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $($SPNToken)
    $conn
    
    Write-Verbose "Connect to database and execute SQL script"
    $conn.Open() 
    $query = 'select @@version'
    $command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $conn)     
    $Result = $command.ExecuteScalar()
    $Result
    $conn.Close() 
    

    上面的例子是使用跨平台的 .NET 核心库。要从 Python 调用它们,可以尝试使用 pythonnet 库。

    https://github.com/pythonnet/pythonnet

    【讨论】:

    • 感谢您的建议。看起来您是用 Java 编写的,而我正在寻找 Python 中的解决方案。根据我的阅读,您可以通过对服务器的休息调用获得访问令牌,然后使用 Java 中的一些 Sql 包进行调用。这是否也可以在 python 中使用 SQL 包?
    • 抱歉,我错过了关于 Python 的部分。上面的代码示例使用了跨平台的 PowerShell Core 和 .Net Core 库。我还没有尝试过,但我相信一种方法是使用 Python for .NET 库。
    • Hey Merill 我会给你 50 分,但由于这是一种变通方法,必须在 Java 和 Python 之间来回转换数据才能使其工作,我不会接受它问题的答案。
    • 谢谢!希望我们能尽快找到更好的方法。
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2014-01-12
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多