无法连接到 Synapse Analytics 中的视图

问题描述 投票:0回答:1

我无法从驻留在 Synapse Analytics 中的数据库的特定视图连接和检索数据。数据库与显示的屏幕截图相同

我要

  1. 连接到数据库:DataverseEnhanced(我已经在源代码中提供了数据库,但是,它不起作用)
  2. 如何从视图中检索数据,比方说,帐户。

这是我的源代码

import pyodbc

server = '**********-ondemand.sql.azuresynapse.net'
database = 'DataverseEnhanced'
username = '********'
password = '*********'   
driver= '{ODBC Driver 17 for SQL Server}'


def main():
    connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
    with pyodbc.connect(connection_string) as conn:
        with conn.cursor() as cursor:
            #cursor.execute("SELECT * FROM sys.databases")
            query_1 = 'SELECT * FROM  account'
            cursor.execute(query_1)
            
            query_2 = 'SELECT * FROM sys.databases'
            cursor.execute(query_2)
            # Fetch the results
            results = cursor.fetchall()
            # Print the results
            print(results)
            
            
if __name__ == "__main__":
    main()

谢谢大家提供任何线索。

---------------- 再次---------------------------- ----------

我只是想知道这里发布的解决方案是否适合我。

我的数据库和视图以不同的方式创建。

  1. 创建 azure 突触分析工作区和存储帐户
  2. 链接数据空间中的所有表,
  3. 数据库 dataverse_dynam***** 已创建
  4. 运行脚本文件来创建所有视图。
USE [dataverse_dynamicsprod_b07143b1d36945e0ae198260d58696] --Specify the name of the database corresponding to your Synapse Link for Dataverse

--=================================================================================================
--PROVIDE INPUT PARAMETERS:
--=================================================================================================
DECLARE
    @EnrichedViewDatabase sysname, --Specify the name of the database in which views with enriched entities will be created
    @EnrichedViewSchema sysname, --Specify the name of the database schema in which views with enriched entities will be created
    @EnrichedColumnSuffix varchar(50),  --Specify the suffix for columns enriched with human-readable descriptions. For example, the suffix of "label" will change a statecode column in the base table to a statelabel column in the enriched view.
    @LanguageCode varchar(10), --Specify the language code for localized labels. For example, English - United States is 1033 (https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oe376/6c085406-a698-4e12-9d4d-c3b0ee3dbc4a)
    @BaseTableSuffix varchar(50), --If applicable, specify the suffix in the names of the base tables or views (e.g., '_partitiond'). The default is an empty string.
    @PreviewOnly bit --Indicate whether to preview the SQL Script (without creating the views) = 1 ; Create views = 0;

SET @EnrichedViewDatabase = 'DataverseEnhanced'
SET @EnrichedViewSchema = 'dbo'
SET @EnrichedColumnSuffix = 'label'
SET @LanguageCode = 1033
SET @BaseTableSuffix = ''
SET @PreviewOnly = 0 

--=================================================================================================
-- Do not edit the script below this point
--=================================================================================================

--Get column metadata from the Lake Database managed by Synapse Link for Dataverse
--The column metadata will be stored as a JSON document in a scalar variable
--This is needed as a workaround for the limitation of not allowing system objects to be used in distributed queries
DECLARE @ColumnMetadata nvarchar(MAX), @ColumnMetadataSQL nvarchar(MAX)

--Define the SQL statement to retrieve column metadata from the Lake Database managed by Synapse Link for Dataverse
--Results will be stored as a JSON document in a variable
SET @ColumnMetadataSQL = 'SET @ColumnMetadataOUT = (
SELECT TABLE_SCHEMA, 
    TABLE_NAME, 
    COLUMN_NAME, 
    ORDINAL_POSITION, 
    DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = ''dbo''
    AND TABLE_NAME NOT IN (''OptionsetMetadata'', ''GlobalOptionsetMetadata'',''StateMetadata'',''StatusMetadata'', ''TargetMetadata'')
    AND TABLE_NAME LIKE ''%' + @BaseTableSuffix + '''
FOR JSON AUTO)'
DECLARE @ParmDefinition NVARCHAR(MAX);  
SET @ParmDefinition = N'@ColumnMetadataOUT NVARCHAR(MAX) OUTPUT';  
EXECUTE sp_executesql @ColumnMetadataSQL, @ParmDefinition, @ColumnMetadataOUT=@ColumnMetadata OUTPUT;  

--Declare a variable to store a SQL statement for creating enriched views
DECLARE @SQL nvarchar(MAX) = ''

; WITH CM AS (
--Parse column metadata variable and construct a table based on its content
SELECT JSON_VALUE(CM.value, '$.TABLE_SCHEMA') AS TableSchema,
     JSON_VALUE(CM.value, '$.TABLE_NAME') AS TableName,
     LEFT(JSON_VALUE(CM.value, '$.TABLE_NAME'), LEN(JSON_VALUE(CM.value, '$.TABLE_NAME'))-LEN(@BaseTableSuffix)) AS EntityName,
     JSON_VALUE(CM.value, '$.COLUMN_NAME') AS ColumnName,
     CAST(JSON_VALUE(CM.value, '$.ORDINAL_POSITION') AS INT) AS OrdinalPosition,
     JSON_VALUE(CM.value, '$.DATA_TYPE') AS DataType
FROM OPENJSON (@ColumnMetadata) AS CM
)

, OSM AS (
--Get Option Set Metadata
SELECT DISTINCT 
    EntityName, 
    OptionSetName, 
    QUOTENAME(EntityName + '_' + OptionSetName) AS Alias
FROM dbo.[OptionsetMetadata]
WHERE LocalizedLabelLanguageCode = @LanguageCode
)

...

所以,没有凭证名称。也就是说,两个GRANT不能执行

还有其他建议或建议吗?

非常感谢

python pyodbc azure-synapse
1个回答
1
投票

无法连接到 Synapse Analytics 中的视图

根据您提供的信息,您想从 synapse Serverless SQL 池中的视图中读取数据。

我们知道,synapse 无服务器 SQL 池主要只处理具有外部源的数据,要从中读取数据,我们的用户需要对象的权限和范围内的凭据。

要授予用户访问权限,您可以使用以下代码:

GRANT  REFERENCES  ON  DATABASE  SCOPED  CREDENTIAL::<credential-name> to <user>

GRANT  SELECT  ON  OBJECT::<view-name> TO <user>;

否则你会遇到这个错误:

enter image description here

我创建示例视图的代码:

#created scoped credentials
CREATE  DATABASE  SCOPED  CREDENTIAL AppCred
WITH  IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<sas-token>';
#created eexternal data source
CREATE  EXTERNAL  DATA  SOURCE [fsn2p_dlsg2p_dfs_core_windows_net]
WITH (
LOCATION = '<file-location>',
CREDENTIAL = AppCred
)
GO
#created view
CREATE  VIEW demoview1 as  SELECT * from
OPENROWSET(
BULK  'file1.csv',
DATA_SOURCE = 'fsn2p_dlsg2p_dfs_core_windows_net',
FORMAT = 'CSV',
HEADER_ROW = TRUE
) WITH (
[Id] VARCHAR (500),
[name] VARCHAR (100))AS [result];

访问视图的代码:

import  pyodbc
# Define the connection string
server = '<synapse-workspace-name>-ondemand.sql.azuresynapse.net'
database = '<database-name>'
username = '<username>'
password = '<password>'
driver= '{ODBC Driver 17 for SQL Server}'
connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
# Establish a connection to the SQL pool
conn = pyodbc.connect(connection_string)
# Create a cursor object
cursor = conn.cursor()
# Execute a SQL query
query = 'SELECT * FROM demoview1'
cursor.execute(query)
# Fetch the results
results = cursor.fetchall()
# Print the results
print(results)

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.