Snowflake Python APIs: conceitos gerais

O modelo de programação do Snowflake Python APIs é baseado em recurso, o que significa que as APIs consistem em um conjunto de objetos que representam suas respectivas contrapartes de objeto no Snowflake. Alguns exemplos básicos de tipos de objeto de recurso do Snowflake incluem o seguinte:

  • Bancos de dados

  • Esquemas

  • Tabelas

  • Exibições

  • Alertas

  • Canais

  • Estágios

  • Usuários

  • Warehouses

Para cada recurso compatível, a API Python fornece três classes distintas com as quais você pode interagir:

Ponto de entrada: O objeto Root

O objeto Root é o ponto de entrada para a API Python. É possível criar uma instância de Root configurada com o contexto do Snowflake no qual ela será executada, usando um objeto Connection Python Connector ou um objeto Session Snowpark.

Por exemplo, o código a seguir instancia um objeto Root com um objeto Connection nomeado my_connection:

from snowflake.core import Root

root = Root(my_connection)
Copy

Ou você pode instanciar um objeto Root com um objeto Session. Em um ambiente de notebook ou procedimento armazenado, você pode recuperar a sessão usando get_active_session() da seguinte forma:

from snowflake.core import Root
from snowflake.snowpark.context import get_active_session

session = get_active_session()
root = Root(session)
Copy

Escopos de conta, banco de dados e esquema

Com um objeto Root, é possível acessar as coleções de objetos com escopo de conta, como warehouses (root.warehouses), bancos de dados (root.databases) e volumes externos (root.external_volumes).

É possível acessar objetos com escopo de banco de dados em um DatabaseResource, que, por sua vez, podem ser recuperados através do objeto DatabaseCollection em Root. Atualmente, SchemaCollection é o único tipo de objeto disponível no escopo do banco de dados.

É possível acessar objetos com escopo de esquema, como tabelas, exibições, fluxos e estágios, por meio do objeto SchemaResource.

Por exemplo, o código a seguir acessa primeiro um StageCollection e depois um StageResource:

root = Root(my_connection)
stages = root.databases["my_db"].schemas["my_schema"].stages
my_stage = stages["my_stage"] # Access the "my_stage" StageResource
Copy

Diagrama de classe snowflake.core

O diagrama a seguir mostra algumas classes básicas no pacote snowflake.core e como elas se relacionam entre si, começando com o objeto Root.

Diagrama mostrando algumas classes básicas no pacote snowflake.core e como elas se relacionam entre si

Classe de coleção

As classes Collection correspondem às classes nomeadas <SnowflakeObjectType>Collection.

Uma classe Collection representa o conjunto de um tipo de objeto específico visível dentro do contexto fornecido. Para objetos com escopo de esquema (como tabelas, exibições, funções e fluxos), a coleção consiste em todos os objetos desse tipo dentro do esquema fornecido que são visíveis para a função ou usuário atual.

Objetos SchemaCollection estão no escopo de um banco de dados, e objetos no escopo da conta, como WarehouseCollection, são acessíveis diretamente da instância Root.

Em geral, as coleções permitem que você faça o seguinte:

  • Crie um objeto no esquema, banco de dados ou conta (dependendo do escopo e do contexto, conforme descrito anteriormente).

  • Itere pelo conjunto de objetos visíveis nesse escopo.

Por exemplo, o código a seguir cria um novo warehouse usando um objeto WarehouseCollection:

# my_wh is created from scratch
my_wh = Warehouse(name="my_wh", warehouse_size="X-Small")
root.warehouses.create(my_wh)
Copy

Recuperação de um objeto Resource de uma coleção

Além disso, as coleções fornecem um ponto de entrada para recuperar objetos Resource específicos no banco de dados Snowflake subjacente ao qual a API está conectada. Use o operador de índice de colchetes ([ ]) em uma coleção para “apontar” ou obter uma referência a um objeto Snowflake dentro dessa coleção.

Por exemplo, o código a seguir recupera uma referência a um warehouse existente nomeado my_wh em sua conta Snowflake:

# my_wh_ref is retrieved from an existing warehouse
# This returns a WarehouseResource object, which is a reference to a warehouse named "my_wh" in your Snowflake account
my_wh_ref = root.warehouses["my_wh"]
Copy

Classe de modelo

As classes de modelo simplesmente têm os mesmos nomes que seus recursos equivalentes no Snowflake, como Warehouse para warehouses e Table para tabelas.

Uma classe de modelo representa um objeto Snowflake junto com suas propriedades associadas, como seu nome, o banco de dados e o esquema ao qual ele pertence (se aplicável) e atributos específicos para esse tipo de objeto. Por exemplo, um modelo de warehouse indica as propriedades warehouse_size, type e auto_resume para aquele objeto de warehouse específico.

Objetos de modelo contêm um “conjunto de propriedades” (uma coleção de propriedades e seus valores) que descreve coletivamente o objeto. É possível usar essas propriedades para descrever um objeto existente no Snowflake ou para fornecer a especificação desse recurso para alterar um objeto existente.

Busca do objeto modelo de um Resource

Para retornar o conjunto de propriedades de um objeto como ele existe atualmente em seu banco de dados Snowflake, você executa uma operação fetch() no objeto Resource.

Por exemplo, o código a seguir demonstra algumas operações que é possível executar usando um objeto de modelo:

# my_wh is fetched from an existing warehouse
my_wh = root.warehouses["my_wh"].fetch()
print(my_wh.name, my_wh.auto_resume)
Copy
# my_wh is fetched from an existing warehouse
my_wh = root.warehouses["my_wh"].fetch()
my_wh.warehouse_size = "X-Small"
root.warehouses["my_wh"].create_or_alter(my_wh)
Copy

Nota

Esta operação de busca falhará se o objeto my_wh não existir no Snowflake.

Classe de recurso

As classes Resource correspondem às classes nomeadas <SnowflakeObjectType>Resource.

É possível considerar um objeto Resource como um ponteiro ou referência para um objeto Snowflake subjacente. Enquanto a classe do modelo é um simples conjunto de propriedades que representa as propriedades ou especificações de um objeto, a classe Resource é uma referência ao objeto real em seu banco de dados Snowflake.

Para obter um objeto Resource, você normalmente se refere a ele pelo nome de sua Collection correspondente, usando o operador de índice de colchetes ([ ]). O exemplo de código a seguir recupera um warehouse existente nomeado my_wh da coleção de warehouse:

# my_wh_ref is retrieved from an existing warehouse
# This returns a WarehouseResource object, which is a reference to a warehouse named "my_wh" in your Snowflake account
my_wh_ref = root.warehouses["my_wh"]

# Fetch returns the properties of the object (returns a "Model" Warehouse object that represents that warehouse's properties)
wh_properties = my_wh_ref.fetch()
Copy

Para converter um objeto Resource em seu modelo correspondente, execute um fetch() no recurso – isso recupera as propriedades do objeto correspondente no Snowflake. Observe que esta operação de busca falhará se o objeto não existir de fato no Snowflake.

Execução de operações específicas de tipo em um objeto Resource

A classe Resource também implementa as operações de API especializadas do tipo de objeto. Por exemplo, você usa um objeto WarehouseResource para retomar um warehouse ou um objeto StageResource para listar os arquivos em um estágio.

Os exemplos de código a seguir mostram como executar essas operações específicas de tipo usando seus respectivos objetos Resource:

# my_wh_ref is retrieved from an existing warehouse
my_wh_ref = root.warehouses["my_wh"]

# Resume a warehouse using a WarehouseResource object
my_wh_ref.resume()
Copy
# my_stage is fetched from an existing stage
stage_ref = root.databases["my_db"].schemas["my_schema"].stages["my_stage"]

# Print file names and their sizes on a stage using a StageResource object
for file in stage_ref.list_files():
  print(file.name, file.size)
Copy

Como usar a API create_or_alter

Os objetos Resource também expõem o método da API create_or_alter se ele for compatível com o recurso. Este método permite que você, como o nome sugere, crie ou altere objetos Snowflake.

Nota

O API Python usa esse mecanismo de criar ou alterar (COA) para modificar objetos no Snowflake. O objetivo desse mecanismo é garantir que o resultado de uma operação COA seja o mesmo, independentemente de esse objeto específico já existir em seu banco de dados Snowflake.

Em outras palavras, se o objeto não existisse anteriormente, a operação COA criaria um com a especificação fornecida; se já existisse, a operação alteraria o objeto existente para corresponder à especificação solicitada. Essa lógica permite que você crie ou altere recursos usando um único trecho de código de maneira idempotente e atômica.

Padrão de design consistente para gerenciar recursos

O Snowflake Python APIs tem um padrão de design consistente que você usa para gerenciar recursos no Snowflake. Considere um cenário de exemplo em que você precisa alterar um objeto de warehouse existente em sua conta. As etapas a seguir descrevem como você normalmente trabalha com o padrão de design da API para fazer isso, usando todos os três tipos de classe conforme descrito anteriormente.

1. Obtenha uma WarehouseCollection de Root

Os warehouses são objetos com escopo de conta que você pode acessar diretamente de Root:

my_warehouses = root.warehouses # my_warehouses is a WarehouseCollection
Copy

2. Obtenha um objeto de WarehouseResource de WarehouseCollection

Para recuperar um objeto Resource, normalmente você começa com sua coleção. Os objetos Collection fornecem um ponto de entrada para recuperar recursos específicos no banco de dados Snowflake subjacente usando o operador de índice de colchetes ([ ]):

my_wh_ref = my_warehouses.warehouses["my_wh"] # my_wh_ref is a WarehouseResource
Copy

3. Obtenha o modelo de Warehouse de WarehouseResource

Usando o objeto WarehouseResource, você busca o modelo de Warehouse correspondente e suas propriedades do Snowflake:

my_wh = my_wh_ref.fetch() # my_wh is a Warehouse model object
Copy

4. Modifique uma propriedade no modelo Warehouse

Em seguida, você modifica uma propriedade, como warehouse_size, em seu modelo de warehouse:

my_wh.warehouse_size = "X-Small"
Copy

5. Altere o objeto de warehouse existente no Snowflake

Por fim, usando sua especificação de modelo de warehouse modificada, você altera o objeto de warehouse existente no Snowflake (ou cria o objeto de warehouse se ele não existir):

my_wh_ref.create_or_alter(my_wh) # Use the WarehouseResource to perform create_or_alter
Copy

Usando essa referência de my_wh_ref, também é possível executar outras operações no objeto no Snowflake, como descartá-lo, se necessário.

Exemplo de código completo

O exemplo de código a seguir mostra a operação de criar-ou-alterar do warehouse na íntegra:

# my_wh is fetched from an existing warehouse
my_warehouses = root.warehouses # my_warehouses is a WarehouseCollection
my_wh_ref = my_warehouses.warehouses["my_wh"] # my_wh_ref is a WarehouseResource
my_wh = my_wh_ref.fetch() # my_wh is a Warehouse model object
my_wh.warehouse_size = "X-Small"

my_wh_ref.create_or_alter(my_wh) # Use the WarehouseResource perform create_or_alter
Copy