首页 > 解决方案 > 如何将雪花主键读入python

问题描述

这个问题与另一个问题有点相关:Get List of Primary Key Columns in Snowflake

由于 INFORMATION_SCHEMA.COLUMNS 不提供有关主键的所需信息。并且当查询并行运行时,Snowflake 本身提出的方法(您将在其中描述表后跟 result_scan)是不可靠的。我正在考虑使用SHOW PRIMARY KEYs IN DATABASE. 这在从 Snowflake 中查询数据库时非常有用。但是,一旦我尝试在 python 中执行此操作,我就会得到列名的结果,例如“内置函数 id”。这在动态生成 sql 语句时没有用。

我正在使用的代码如下:

SQL_PK = "SHOW PRIMARY KEYS IN DATABASE;"
snowflake_service = SnowflakeService(username=cred["username"], password=cred["password"])
snowflake_service.connect(database=DATABASE,role=ROLE, warehouse=WAREHOUSE)
curs = snowflake_service.cursor
primary_keys = curs.execute(SQL_PK).fetchall()
curs.close()
snowflake_service.connection.close()

有什么我做错了吗?甚至可以这样做吗?或者,当将这些查询作为一个字符串发送时,Snowflake 提供的解决方案是否足够可靠?尽管有许多表,但需要多次往返才能获取所需的所有数据。

标签: pythonpython-3.xprimary-keysnowflake-cloud-data-platform

解决方案


当查询并行运行时,您将在其中描述表后跟 result_scan,这是不可靠的

您可以使用information_schema.query_history_by_session搜索特定查询运行,然后使用 retrieved 引用结果集QUERY_ID

SHOW PRIMARY KEYS IN DATABASE;

-- find the newest occurence of `SHOW PRIMARY KEYS`:    
SET queryId = (SELECT QUERY_ID
               FROM TABLE(information_schema.query_history_by_session()) 
               WHERE QUERY_TEXT LIKE '%SHOW PRIMARY KEYS IN DATABASE%'
               ORDER BY ENDTIME DESC LIMIT 1);

SELECT * FROM TABLE(RESULT_SCAN($queryId));

推荐阅读