Snowflake Python APIs:一般概念¶
Snowflake Python APIs 采用 基于资源的 编程模型,这意味着 APIs 由一组对象组成,这些对象在 Snowflake 中分别代表其对应的对象。Snowflake 资源对象类型的一些基本示例包括:
数据库
架构
表
视图
警报
管道
暂存区
用户
仓库
对于每种支持的资源,Python API 提供了三个不同的类,可用于创建和管理对象:
入口点:Root 对象¶
Root 对象是 Python API 的入口点。要创建一个通过 Root 将在其中运行的 Snowflake 上下文配置的该对象实例,您需要使用 Python Connector Connection 对象或 Snowpark Session 对象。
例如,以下代码使用名为 my_connection 的 Connection 对象实例化了 Root 对象:
您也可以使用 Session 对象实例化 Root 对象。在笔记本环境或存储过程中,可以使用 get_active_session() 检索会话,如下所示:
账户、数据库和架构范围¶
使用 Root 对象,您可以访问 账户范围 对象的集合,例如仓库 (root.warehouses)、数据库 (root.databases) 和外部卷 (root.external_volumes)。
您可以访问 DatabaseResource 下的 数据库范围内的 对象,进而可以通过 Root 下的 DatabaseCollection 对象进行检索。目前,SchemaCollection 是数据库范围内唯一可用的对象类型。
您可以通过 SchemaResource 对象访问 架构范围内的 对象,例如表、视图、流和暂存区。
例如,以下代码首先访问 StageCollection,然后访问 StageResource:
snowflake.core 类图¶
下图显示了 snowflake.core 包中的一些基本类以及它们之间的关系,首先是 Root 对象:
集合类¶
Collection 类对应于名为 <SnowflakeObjectType>集合 的类。
Collection 类表示在给定上下文中可见的特定对象类型的集合。对于架构范围内的对象(如表、视图、函数和流),集合由给定架构中当前角色或用户可见的所有该类型的对象组成。
SchemaCollection 对象的范围限定于一个数据库。诸如 DatabaseCollection 和 WarehouseCollection 这样的账户范围的对象可以直接通过 Root 实例访问。
通常,集合允许您执行以下操作:
在架构、数据库或账户中创建对象(视范围和上下文而定,如前所述)。
循环访问该范围内可见的对象集。
例如,以下代码使用 WarehouseCollection 对象创建新仓库:
从集合中检索 Resource 对象¶
此外,集合提供了一个入口点,用于检索 API 所连接的底层 Snowflake 数据库中特定的 Resource 对象。您可以使用集合上的方括号索引运算符 ([ ]) 来“指向”或获取该集合内 Snowflake 对象的引用。
例如,以下代码会检索 Snowflake 账户中名为 my_wh 的现有仓库的引用:
模型类¶
模型类与 Snowflake 中等效资源的名称完全相同,例如 Warehouse 对应仓库,Table 对应表。
模型类表示 Snowflake 对象及其关联属性,例如对象的名称、所属的数据库和架构(如适用)以及特定于该对象类型的属性。例如,仓库模型表示该特定仓库对象的 warehouse_size、type 和 auto_resume 属性。
模型对象包含描述该对象的 *属性包*(属性及其值的集合)。您可以使用这些属性来描述 Snowflake 中的现有对象,也可以提供更改现有对象所用的资源的规范。
从 Resource 提取模型对象¶
要返回 Snowflake 数据库中当前存在的对象的属性包,需要对 Resource 对象运行 fetch() 操作。
例如,以下代码演示了您可以使用模型对象执行的一些操作:
备注
如果 Snowflake 中不存在该 my_wh 对象,则此提取操作将失败。
资源类¶
Resource 类对应于名为 <SnowflakeObjectType>资源 的类。
您可以将 Resource 对象视为指向底层 Snowflake 对象的指针或引用。模型类是代表对象属性或规范的简单属性包,而 Resource 类是对 Snowflake 数据库中实际对象的引用。
要获取 Resource 对象,通常需要从其对应的 Collection 中通过名称引用它,并使用方括号索引运算符 ([ ])。以下代码示例从仓库集合中检索一个名为 my_wh 的现有仓库:
要将 Resource 对象转换为其相应的模型,请在资源上执行 fetch(),检索 Snowflake 中相应对象的属性。如果 Snowflake 中不存在该对象,则此提取操作将失败。
对 Resource 对象执行特定类型的操作¶
Resource 类还实施了对象类型的专属 API 操作。例如,您可以使用 WarehouseResource 对象来恢复仓库,或使用 StageResource 对象来列出暂存区的文件。
以下代码示例显示了如何使用相应的 Resource 对象执行这些特定类型的操作:
使用 create_or_alter API¶
如果资源支持,Resource 对象也会公开 :code:`create_or_alter`API 方法。顾名思义,此方法让您能够创建或更改 Snowflake 对象。
备注
Python API 使用这种创建或更改 (COA) 机制来修改 Snowflake 中的对象。此机制旨在确保无论特定对象是否已存在于 Snowflake 数据库中,COA 操作结果都是相同的。
换句话说,如果对象不存在,则 COA 操作会使用提供的规范创建一个对象;如果该对象存在,则该操作会更改现有对象以匹配所请求的规范。此逻辑使您能够通过使用一段代码,以幂等和原子方式创建或更改资源。
管理资源的统一设计模式¶
Snowflake Python APIs 具有一致的设计模式,可用于管理 Snowflake 中的资源。以一个示例场景为例,您需要更改账户中现有的仓库对象。以下步骤概述了您通常如何使用前面描述的三种类类型,按照 API 的设计模式进行操作。
1. 从 Root 中获取 WarehouseCollection¶
仓库是账户范围内的对象,您可以直接通过 Root 访问:
2. 从 WarehouseCollection 中获取 WarehouseResource 对象¶
要检索 Resource 对象,通常从其集合开始。Collection 对象为您提供了一个入口点,让您可以使用方括号索引运算符 ([ ]) 检索底层 Snowflake 数据库中的特定资源
3. 从 WarehouseResource 中提取 Warehouse 模型¶
使用 WarehouseResource 对象,您可以从 Snowflake 中提取相应的 Warehouse 模型及其属性:
4. 修改 Warehouse 模型中的属性¶
修改仓库模型中的属性,例如 warehouse_size:
5. 更改 Snowflake 中的现有仓库对象¶
最后,使用修改后的仓库模型规范,更改 Snowflake 中的现有仓库对象(如果不存在,则创建仓库对象):
使用此 my_wh_ref 引用,还可以在 Snowflake 中对该对象执行其他操作,例如根据需要将其删除。
完整代码示例¶
以下代码示例展示了从开始到结束完整的创建或更改仓库操作: