Uso das funções de modelo

Para permitir a concatenação de identificadores SQL, como nomes de banco de dados e nomes de esquema, e fornecer flexibilidade no uso de identificadores entre aspas ou sem aspas em diferentes contextos, Snowflake CLI fornece o seguinte conjunto de funções utilitárias que você pode usar em modelos de definição de modelo de projeto:

fn.concat_ids()

  • Entrada: um ou mais argumentos de cadeia de caracteres (ID SQL ou cadeia de caracteres simples)

  • Saída: um ID SQL válido (entre aspas ou não)

A função fn.concat_ids() concatena vários argumentos de cadeia de caracteres em uma única cadeia de caracteres que representa um ID SQL (entre aspas ou não). Se qualquer uma das cadeias de caracteres de entrada for um identificador válido entre aspas, ele não será escapado antes da concatenação. A cadeia de caracteres resultante é então escapada e colocada entre aspas se contiver caracteres não seguros para SQL ou se qualquer uma das cadeias de caracteres de entrada for um identificador entre aspas válido.

Exemplos:

  • Chamar fn.concat_ids('id1_', '"quoted_id2"') retorna "id1_quoted_id2" porque um dos valores de entrada é um identificador entre aspas.

  • Chamar fn.concat_ids('id1_', 'id2') resulta em id1_id2 porque nenhum dos valores de entrada é um identificador entre aspas e nenhum dos valores de entrada contém caracteres não seguros para SQL.

fn.str_to_id()

  • Entrada: um ou mais argumentos de cadeia de caracteres (ID SQL ou cadeia de caracteres simples)

  • Saída: um ID SQL válido (entre aspas ou não)

A função fn.str_to_id() resulta uma cadeia de caracteres como um ID. Se a cadeia de caracteres de entrada contiver um identificador válido entre aspas ou sem aspas, a função retornará como está. Entretanto, se a cadeia de caracteres de entrada contiver caracteres não seguros para SQL que não estejam corretamente entre aspas, a função retornará uma ID entre aspas que escapa os caracteres não seguros.

Exemplos:

  • Chamar fn.str_to_id('id1') retorna id1 porque ele é um identificador válido sem aspas.

  • Chamar fn.str_to_id('unsafe"id') retorna "unsafe""id" porque ele contém caracteres não seguros para SQL.

fn.id_to_str()

  • Entrada: um argumento de cadeia de caracteres (ID SQL ou cadeia de caracteres simples)

  • Saída: uma cadeia de caracteres simples

Se a entrada for um ID SQL válido, a função retornará uma cadeia de caracteres simples sem escape. Caso contrário, a função retorna a cadeia de caracteres de entrada como está.

Exemplos:

  • Chamar :fn.id_to_str('id1') retorna id1 porque já está sem aspas.

  • Chamar :codenowrap:` fn.id_to_str(“«quoted»»id.example»”)` retorna quoted"id.example.

fn.get_username()

  • Entrada: uma cadeia de caracteres opcional com o valor de fallback

  • Saída: nome de usuário atual detectado no sistema operacional

Retorna o nome de usuário atual das variáveis de ambiente do sistema operacional. Se o nome de usuário atual não for encontrado ou estiver vazio, um valor vazio será retornado ou o valor de fallback será usado, se algum for fornecido.

Exemplos:

  • fn.get_username('default_user') retorna o nome de usuário atual, se encontrado, caso contrário, default_user é retornado.

fn.sanitize_id()

  • Entrada: um argumento de cadeia de caracteres

  • Saída: um ID SQL válido sem aspas

A função fn.sanitize_id() remove quaisquer caracteres não seguros para SQL da entrada e a retorna como um ID SQL válido sem aspas. Se o resultado não começar com uma letra ou um sublinhado, um sublinhado será anexado a ele. Para cadeias de caracteres muito longas, a função trunca a cadeia de caracteres para 255 caracteres.

Exemplos:

  • Ao usar fn.sanitize_id('Some.id"With_Special_Chars') a saída é SomeidWith_Special_Chars.

  • Ao usar fn.sanitize_id('1abc') a saída é _1abc.

Amostra de caso de uso

O exemplo a seguir mostra como usar essas funções nos arquivos de definição de projeto snowflake.yml:

definition_version: 2
entities:
  pkg:
    type: application package
    identifier: <% fn.concat_ids(ctx.env.app_name, ctx.env.pkg_suffix) %>
    artifacts:
      - src: app/*
        dest: ./
  app:
    type: application
    identifier: <% fn.concat_ids(ctx.env.app_name, ctx.env.app_suffix) %>

env:
  app_name: myapp_base_name_<% fn.sanitize_id(fn.get_username()) %>
  app_suffix: _app_instance
  pkg_suffix: _pkg
Copy

O exemplo a seguir ilustra como usar as funções em um arquivo SQL:

DESC APPLICATION <% fn.str_to_id(ctx.entities.app.identifier) %>;
DESC APPLICATION PACKAGE <% fn.str_to_id(ctx.entities.pkg.identifier) %>;
Copy