Preparando uma pasta local com artefatos Snowflake Native App configurados

Crie uma pasta local com artefatos configurados

O comando snow app bundle cria um diretório local no projeto, preenche-o com a estrutura de arquivo especificada no arquivo de definição do projeto e gera declarações CREATE FUNCTION ou CREATE PROCEDURE em scripts de configuração do Snowflake Native App a partir do código Snowpark Python que inclui decoradores (como @sproc ou @udaf). Para obter mais informações, consulte a documentação do Snowpark Python correspondente ao decorador de função escolhido, como snowflake.snowpark.functions.udaf.

Os comandos snow app deploy e snow app run já usam essa funcionalidade. No entanto, agora com um comando explícito snow app bundle à sua disposição, é possível explorar esse diretório antes que ele seja carregado no estágio, para verificar se os artefatos foram criados conforme o esperado.

Para criar uma pasta local com os artefatos configurados, faça o seguinte:

  1. Crie ou verifique seu arquivo de definição de projeto Snowflake snowflake.yml, como:

    definition_version: 2
    entities:
      codegen_nativeapp_pkg:
        type: application package
        manifest: root_files/_manifest.yml
        artifacts:
          - src: root_files/README.md
            dest: README.md
          - src: root_files/_manifest.yml
            dest: manifest.yml
          - src: root_files/setup_scripts/*
            dest: setup_scripts/
          - src: python/user_gen/echo.py
            dest: user_gen/echo.py
          - src: python/cli_gen/*
            dest: cli_gen/
            processors:
              - snowpark
      codegen_nativeapp_pkg:
        type: application
        from:
          target: codegen_nativeapp_pkg
    
    Copy
  2. No diretório do projeto, execute o comando snow app bundle para criar o diretório temporário output/deploy que contém os artefatos configurados.

    snow app bundle
    
    Copy
  3. Verifique se o conteúdo do diretório de saída ou de implementação corresponde às regras especificadas no arquivo snowflake.yml. Se você invocou o processamento de anotação do Snowpark em seus arquivos Python, poderá ver o código gerado no script de configuração alterado no diretório.

Para obter mais informações, consulte o comando snow app bundle.

Como gerar código SQL usando o processamento de anotação do Snowpark

Como desenvolvedor de Snowflake Native App com experiência limitada de SQL, você pode achar complicado escrever e manter scripts de configuração, que podem ficar muito grandes e complicados com o tempo. Os scripts de configuração contêm toda a lógica do aplicativo que um cliente pode usar com seus dados e, portanto, são uma parte necessária do desenvolvimento de um Snowflake Native App. Um dos principais componentes dos scripts de configuração é a capacidade de usar funções de extensão do Snowpark Python para funções e procedimentos armazenados. Além de escrever o código do Snowpark em Python, Java ou outras linguagens compatíveis com Snowpark, é necessário escrever as partes correspondentes dessas funções e procedimentos usando SQL no script de configuração.

Por exemplo, você pode criar uma função básica e um procedimento armazenado usando o Snowpark Python, conforme mostrado:

# Example python file "echo.py" that a developer writes

def echo_fn(data):
    return 'echo_fn: ' + data

def echo_proc(session, data):
    return 'echo_proc: ' + data
Copy

Você precisaria então carregar o arquivo em um estágio e consultá-lo no código SQL do script de configuração, semelhante ao seguinte:

-- Sample setup_script.sql SQL file for a Snowflake Native App

CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_proc'
  IMPORTS=('/echo.py');

    GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
      TO APPLICATION ROLE app_instance_role;

-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');

GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
  TO APPLICATION ROLE app_instance_role;
Copy

Geração automática de código SQL

Nota

Para aproveitar a geração automática de código SQL, é necessário usar o Snowpark Python versão 1.15.0 e superior.

Para ajudar a aliviar esse trabalho extra, Snowflake CLI pode gerar automaticamente o SQL necessário para seus scripts de configuração. O Snowpark Python oferece suporte a um recurso chamado decoradores de função de extensão (@udf, @sproc, @udtf e @udaf) que permitem que você anote seu código Python, como usar o decorador de função snowflake.snowpark.functions.udf. Snowflake CLI pode usar esses decoradores para criar e validar automaticamente o código SQL necessário para seus scripts de configuração.

Por exemplo, é possível usar o decorador @udf para a função no exemplo anterior:

# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
  return 'echo_fn: ' + str
Copy

O uso do decorador @udf informa ao snow app bundle da Snowflake CLI (e outros comandos que invocam internamente o comando snow app bundle) para processar os decoradores de Snowpark Python, gerar os comandos SQL correspondentes e incluí-los no script de configuração automaticamente, conforme mostrado. É possível, portanto, minimizar a quantidade de código SQL que precisa ser escrito para seu script de configuração.

-- Sample setup_script.sql SQL file for a Snowflake Native App

-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_fn'
  IMPORTS=('/echo.py');

  GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
    TO APPLICATION ROLE app_instance_role;
Copy

Como usar os decoradores do Snowpark Python

Embora os decoradores do Snowpark em Snowflake CLI funcionem da mesma forma que os decoradores Snowpark Python regulares, é necessário estar ciente das seguintes diferenças ao escrever arquivos de código Python especificamente para um Snowflake Native App:

  • Não é possível usar nenhum objeto Session nesses arquivos, pois Snowflake CLI executa esses arquivos Python em um ambiente sandbox sem conexão com o Snowflake. Como resultado, qualquer referência a um Session de Snowpark resulta em um erro.

  • É possível usar apenas os decoradores Snowpark Python @udf, @sproc, @udaf e @udtf.

  • Você não pode usar esses decoradores como funções regulares para registrar seu código como um objeto Snowflake. Somente código explicitamente anotado com os decoradores compatíveis é reconhecido. Portanto, a função Python deve ser uma função nomeada. Funções lambda não são compatíveis.

  • Snowflake CLI sempre gera instruções CREATE OR REPLACE, conforme recomendado pela Snowflake, para criar funções e procedimentos em seus scripts de configuração.

Mais sobre propriedades de decoração

A tabela a seguir lista as propriedades do decorador Python e explica como Snowflake CLI as utiliza.

Propriedades do decorador Python

Propriedade

Detalhes

nome

Opcional

Nome da função ou procedimento armazenado que Snowflake CLI usa para gerar instruções SQL.

Se você omitir esta propriedade, Snowflake CLI reusa o nome da função Python para gerar as instruções SQL.

tipos_de_entrada

Obrigatório

Tipos para cada parâmetro de entrada para esta função ou procedimento armazenado.

Você deve fornecer essas informações neste parâmetro do decorador ou fornecer anotações de tipo diretamente em seu código. Se essas informações não estiverem disponíveis em nenhum local, Snowflake CLI não irá gerar instruções SQL para esta função ou procedimento armazenado.

tipo_de_retorno

Obrigatório

Digite o valor de retorno para esta função ou procedimento armazenado.

Você deve fornecer essas informações neste parâmetro do decorador ou fornecer a anotação de tipo diretamente em seu código. Se essas informações não estiverem disponíveis em nenhum local, Snowflake CLI não irá gerar instruções SQL para esta função ou procedimento armazenado.

pacotes

Opcional

Lista de pacotes. É possível especificar snowflake-snowpark-python com ou sem um número de versão. Se você fornecer um número de versão para este pacote, Snowflake CLI não usará a versão como parte de sua geração de SQL, mas manterá o número de versão para quaisquer outros pacotes na lista.

Se você omitir esta propriedade, Snowflake CLI adiciona snowflake-snowpark-python automaticamente como o único pacote e o reflete nas instruções SQL geradas.

importações

Opcional

Lista de arquivos que sua função Snowflake ou procedimento armazenado precisa importar do estágio. É possível especificá-los como uma cadeia de caracteres ou uma tupla de cadeias de caracteres. Se você especificar uma tupla, Snowflake CLI usa apenas a cadeia de caracteres no índice 0. Para um exemplo de uso de uma tupla, consulte Uso de arquivos Python externos.

Se você não especificar nenhuma importação, Snowflake CLI adicionará automaticamente uma importação para o arquivo Python com a função ou procedimento armazenado para o qual ele gera SQL. O caminho da importação é determinado pelo parâmetro dest do arquivo Python no diretório raiz de implementação, com base no arquivo de definição do projeto.

executar_como

Opcional

Persona a ser usada ao executar um procedimento armazenado. Os valores incluem: caller e owner. Se não for especificado, Snowflake CLI assume owner como padrão. Observe que esta propriedade não se aplica a funções.

manipulador

N/A

Manipulador para a função ou procedimento armazenado. Snowflake CLI preenche automaticamente este campo.

substituir

Não utilizado

Snowflake CLI assume true para geração de código.

sessão

Obrigatório

Deve ser None. Se omitido, Snowflake CLI gera um erro.

is_permanent

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

localização_do_estágio

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

se_não_existir

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

estrito

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

seguro

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

imutável

Não utilizado

Snowflake CLI não usa este campo para geração de SQL.

parâmetros_do_aplicativo_nativo

Opcional

(Apenas para um Snowflake Native App)

Dicionário Python com os seguintes parâmetros de Snowflake Native App:

  • schema: Nome do esquema que conterá a função Snowpark ou o procedimento armazenado. Este esquema já deve estar definido em seu script de configuração. A Snowflake recomenda configurar o valor como o nome de um esquema versionado no arquivo de script de configuração. Snowflake CLI prefixa esse valor ao nome da função ou procedimento Snowpark na instrução SQL gerada. Observe que Snowflake CLI não cria o esquema para você.

  • application_roles: Lista de funções de aplicativo que receberão privilégios USAGE na função ou procedimento Snowpark gerado. Snowflake CLI não cria as funções de aplicativo; ele apenas cria instruções SQL como GRANT USAGE ON FUNCTION <schema_name.func_name> TO APPLICATION ROLE <app_role> e as adiciona ao script de configuração.

Embora tecnicamente opcional, não especificar a propriedade native_app_params no arquivo de definição do projeto pode resultar em um script de configuração inválido.

Ao enviar seus arquivos Python para um estágio de destino, Snowflake CLI converte os decoradores em comentários, para que esses UDFs e os procedimentos armazenados não sejam criados na sessão atual. Os arquivos de origem originais não são alterados para que o comando snow app bundle permaneça independente. Somente os arquivos Python no diretório raiz de implementação são alterados para conter os comentários, pois a raiz de implementação é recriada toda vez que você executa o comando snow app bundle. O exemplo a seguir ilustra como Snowflake CLI comenta os decoradores.

# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#:    return_type=IntegerType(),
#:    input_types=[IntegerType(), IntegerType()],
#:    packages=["snowflake-snowpark-python==1.15.0"],
#:    native_app_params={
#:        "schema": "ext_code_schema",
#:        "application_roles": ["app_instance_role"],
#:    },
#: )
def add_sp(session_, x, y):
    return x + y
Copy

Além disso, apenas arquivos Python com uma propriedade processors no arquivo de definição do projeto são afetados.