繁体   English   中英

使用 Python 连接到 Azure Synapse Serverless SQL

[英]Connecting to Azure Synapse Serverless SQL using Python

我正在尝试使用 python 连接到 Azure Serverless SQL 但出现以下错误

External table 'dbo.my_table' is not accessible because location does not exist or it is used by another process.

我使用以下命令创建了外部表。

首先,我创建了一个数据库 scope 凭证

CREATE DATABASE SCOPED CREDENTIAL python_access_credential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET =  '<SAS TOKEN>';

然后我使用以下命令使用上述数据库 scope 凭据创建了外部数据源

CREATE EXTERNAL DATA SOURCE python_data WITH ( LOCATION ='abfss://<StorageAccount>.dfs.core.windows.net', CREDENTIAL= [python_access_credential]);

然后我创建了外部表

CREATE EXTERNAL TABLE my_table ([C1] bigint, [C2] nvarchar(4000))WITH (LOCATION ='data.tsv', DATA_SOURCE = [python_data],FILE_FORMAT = [SynapseDelimitedTextFormat])

然后,我运行以下命令来授予对 python 脚本中使用的用户的访问权限

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[python_access_credential] TO [user];

此外,当我尝试通过 Synapse Studio 访问表时,也会出现同样的错误

我参考了许多 Azure 文档、Microsoft Q&A 页面和我发现的另一个堆栈溢出问题,但找不到解决方案。 大多数答案都指向使用 DATABASE SCOPE CREDENTIALS 并在创建外部数据源时在 CREDENTIAL 参数中使用它,我已经这样做了。

我建议您创建一个链接数据集并使用 GUI 为您完成所有这些工作。 今天,我将介绍使用 parquet 格式存储在数据湖中的 [sales_lt] 数据库和 [address] 表的过程。

在此处输入图像描述

您可以创建两种类型的工作区数据库。 如果您没有使用火花 SQL、select 第一种类型。

在此处输入图像描述

单击加号图标并将名为 [stack_overflow] 的 SQL 数据库添加到无服务器池。 这种类型的池非常棒,因为您只在查询数据时才需要付费。

在此处输入图像描述

从上图中我们可以看出,是新的数据库,[stack_overflow] 现在已经存在。

在此处输入图像描述

如果您熟悉 Azure 数据工厂,请配置连接到数据存储的链接服务并浏览到要转换为表格的文件。 右键单击“创建外部表”菜单选项。

请参阅 MSDN 文章了解“如何创建链接服务”。

https://docs.microsoft.com/en-us/azure/data-factory/concepts-linked-services?tabs=data-factory

在此处输入图像描述

它将询问您默认文本字段大小是多少 - 4000 字节。

在此处输入图像描述

接下来,选择创建并打开一个脚本。 GUI 界面中存在错误。 虽然它声明您可以在数据输入字段中创建新模式和新表,但它不会为模式创建代码。

在此处输入图像描述

只需添加第 13/14 行并更改第 16 行,为表添加名为 [sales_lt] 的模式的前缀。 请注意,这会创建您在上面显示的代码,而不是您的任何实际工作。

在此处输入图像描述

我们需要将 AD 用户添加到 synapse 工作区并授予其查看表的权限。 我将从系统管理员权限开始。 一旦你有它的工作,你可以减少权利。

在此处输入图像描述

找到 Synapse Server-less 池的终点。 简而言之,该服务的外观和行为类似于 SQL 服务器,其数据格式为表格数据 stream (TDS)。

我们可以使用微软最新的驱动,为 python 编写代码来连接数据库。 我们需要使用带有密码选项的 Active Directory。 Synapse 不支持非活动目录用户。

请参阅 MSDN 文档了解如何下载最新的驱动程序(本机 + odbc)。

https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=sql-server-ver16

我是一名 DBA,但我擅长其他语言。 我将使用 SQL Server Management Studio (SSMS) 测试连接。

在此处输入图像描述

输入 Synapse Server-less Pool 的完全限定地址。 添加用户 dilbert@craftydba.com 和正确的密码。

在此处输入图像描述

高级选项卡允许您更改连接。 确保使用 TCP/IP 作为网络协议并且默认数据库是 [stack_overflow]。

在此处输入图像描述

最后但同样重要的是,select 语句从 Synapse Server-less 池中检索数据并将其返回给客户端 SSMS。 简而言之,该解决方案有效。 现在,我们只需要使用 python 对连接和数据检索进行编码。

这是有关如何使用最新的 ODBC 驱动程序用于 SQL 服务器的链接,用于 Python。

https://datatofish.com/how-to-connect-python-to-sql-server-using-pyodbc/

请记住,无服务器池提供对数据湖中文件的读取访问权限。 这些文件看起来像数据库中的表。 此服务不支持任何写入选项。

我能够通过使用托管身份凭据而不是共享访问签名来解决问题。 运行以下代码来创建凭证和外部表

首先创建一个主密钥。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<your_password_1>'

现在创建一个托管身份数据库范围凭据

CREATE DATABASE SCOPED CREDENTIAL <your_credential_name> WITH IDENTITY = 'Managed Identity'

创建一个登录用户和密码。 您将在 python 脚本中使用它来运行查询

CREATE LOGIN <your_login> WITH PASSWORD = '<your_login_password>'

上述登录名将用作 python 脚本中的 UID。 现在创建用户

CREATE USER <your_user> FOR LOGIN <your_login>

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::<your_credential_name> TO<your_user>

现在使用上述凭据创建一个外部数据源,并使用该数据源创建一个外部表

IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = '<FileFormatName>') 
CREATE EXTERNAL FILE FORMAT [<FileFormatName>] 
WITH ( FORMAT_TYPE = DELIMITEDTEXT ,
       FORMAT_OPTIONS (
         FIELD_TERMINATOR = ',',
         USE_TYPE_DEFAULT = FALSE
        ))
GO

IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = '<ExternalDataSourceName>') 
CREATE EXTERNAL DATA SOURCE [<ExternalDataSourceName>] 
WITH (
    CREDENTIAL = <your_credential_name>,
    LOCATION = 'abfss://<container>@<storage-account>.dfs.core.windows.net' 
)
GO

CREATE EXTERNAL TABLE [<table_name>] (
[C1] nvarchar(4000),
[C2] nvarchar(4000),
[C3] bigint,
[C4] bigint
)
WITH (
LOCATION = <Location To File in Container>,
DATA_SOURCE = [<ExternalDataSourceName>],
FILE_FORMAT = [<FileFormatName>]
)
GO

现在,最后一步,授予 Select 访问权限

GRANT SELECT ON OBJECT::[dbo].[<table_name>] TO [<your_user>]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM