Arquivos e modelos dos DCM Projects

Um DCM project requer um arquivo de manifesto e um ou mais arquivos de definição de objeto SQL. Esses arquivos normalmente são armazenados e gerenciados em um repositório Git ou em seu espaço de trabalho local.

  • O arquivo de manifesto

    • Especifica quais arquivos de definição de objeto devem ser incluídos.

    • Define configurações para diferentes ambientes com variáveis de modelo.

  • Os arquivos de definição de objeto

    • Definem um grupo de objetos Snowflake que você deseja gerenciar juntos no DCM project.

O fluxo de trabalho de alto nível para criar arquivos de DCM project é:

  1. Criar uma pasta de DCM project para armazenar seus arquivos de definição

  2. Criação de um arquivo de manifesto

  3. Criar arquivos de definição de objeto

Criar uma pasta de DCM project para armazenar seus arquivos de definição

Para criar um novo DCM project, crie uma pasta para armazenar seu arquivo de manifesto (manifest.yml) e os arquivos de definição de objeto SQL.

snow init <project_name> --template DCM_PROJECT

O comando snow init com o modelo DCM_PROJECT cria arquivos de definição de exemplo no diretório do projeto. Você pode abrir e editar esses arquivos para definir seu DCM project.

Os DCM Projects seguem a estrutura de pastas padronizada:

  • Os arquivos de definição de objeto dos DCM Projects devem ser colocados em sources/definitions/.

  • Os arquivos de macro globais opcionais podem ser colocados em sources/macros/.

  • A nomeação e o aninhamento de arquivos dentro desses diretórios de projeto são flexíveis.

  • Os artefatos de saída salvos dos comandos DCM são sempre gravados em out/.

  • Se você tiver scripts ou arquivos de projeto adicionais que deseja usar para comandos DCM, poderá adicioná-los a sources (por exemplo, arquivos de projeto dbt).

  • Se você tiver outros scripts personalizados que deseja armazenar na pasta do projeto que não devem ser usados pelos comandos dos DCM Projects nem carregados do local, adicione-os a uma pasta fora da pasta sources.

  • Os comandos CLI só carregam arquivos na pasta sources.

Nota

Se você usa o Git, adicione out/ ao arquivo .gitignore para evitar enviar os arquivos de saída locais para o Git.

Exemplo de uma estrutura de pastas de DCM project:

my_dcm_project/
  ├── manifest.yml
  ├── sources/
  │   ├── definitions/
  │   │   ├── bronze.sql
  │   │   └── silver.sql
  │   ├── macros/
  │   │   └── global_macro.sql
  │   └── dbt/
  │       ├── my_dbt_project_1/
  │       └── my_dbt_project_2/
  ├── my_post_scripts/
  └── out/
      └── plan/

Criação de um arquivo de manifesto

Cada DCM project requer um arquivo manifest.yml. Ele contém os detalhes essenciais de configuração do projeto e permite que a pasta do projeto seja identificada como DCM project.

Você usa o arquivo de manifesto para controlar os objetos e as funções do DCM project que devem ser usados na implantação em ambientes de destino diferentes e para gerenciar conjuntos de valores de modelagem.

O arquivo de manifesto é um YAML que contém as seguintes propriedades:

manifest_version: 2
type: DCM_PROJECT
default_target:
targets:
templating:

Propriedade

Obrigatório

Descrição

manifest_version

Obrigatório

Versão do esquema do manifesto. A versão atual é 2.

type

Obrigatório

Tipo do projeto. Defina como DCM_PROJECT.

default_target

Opcional

Se você tem mais de um destino, especifique o destino padrão. A Snowflake CLI e o Workspaces usam o destino padrão se você não especifica um destino usando o sinalizador --target.

targets

Obrigatório

A seção targets mapeia cada destino de implantação para uma conta Snowflake específica, um objeto de DCM project, uma função de proprietário e, opcionalmente, uma configuração de modelagem. Esse mapeamento elimina a necessidade de passar nomes de projetos totalmente qualificados e sinalizadores de configuração em cada comando CLI. Consulte Destinos do projeto para obter mais detalhes.

templating

Opcional

A seção templating define as configurações de modelagem a serem usadas no projeto. Consulte Configurações de modelagem de projeto para obter mais detalhes.

Destinos do projeto

Cada destino no arquivo de manifesto contém as seguintes propriedades:

targets:
  <target_name>:
    account_identifier:
    project_name:
    project_owner:
    templating_config:

Propriedade

Descrição

account_identifier

O identificador da conta Snowflake para o destino.

Consulte Como encontrar a região e o localizador de uma conta.

project_name

O nome totalmente qualificado do objeto de DCM project, por exemplo, DCM_DEMO.PROJECTS.DCM_PROJECT_DEV.

Use o comando SQL SHOW DCM PROJECTS para encontrá-lo.

project_owner

A função com OWNERSHIP neste objeto de projeto.

Use o comando SQL SHOW DCM PROJECTS ou DESCRIBE DCM PROJECT para encontrá-lo.

templating_config (opcional)

O nome da configuração de modelagem definida na seção templating a ser usada para o destino.

Mapear entre definições e objetos de projeto

Os arquivos de definição dos DCM Projects não são estritamente vinculados a um objeto de DCM project específico. Você pode usar o mesmo conjunto de definições para implantar em vários projetos, seja em contas Snowflake diferentes ou fazendo referência a perfis de configuração distintos. Por exemplo, os mesmos arquivos de definição em uma ramificação do repositório podem ser implantados em ambas as contas DEV e PROD, como mostrado na figura a seguir.

Definições do DCM para objetos de projeto DCM

Da mesma forma, você pode executar um objeto de DCM Projects referenciando arquivos de definição de diferentes caminhos. Por exemplo, a automação de CI/CD pode implantar definições da ramificação principal, e você pode executar manualmente um PLAN dos arquivos de definição locais no mesmo projeto para verificar como as definições divergem da implantação mais recente. Você também pode usar essa abordagem para implantações manuais específicas de outras ramificações ou caminhos locais.

Configurações de modelagem de projeto

Veja a seguir a estrutura de alto nível da configuração de modelagem no arquivo de manifesto. Você pode definir apenas defaults, apenas configurations ou ambos.

templating:
  defaults:
    <variable_name>: <value>
  configurations:
    <configuration_name>:
      <variable_name>: <value>

Propriedade

Descrição

defaults

Os valores de variáveis compartilhadas, em pares chave-valor, que se aplicam a todas as configurações para evitar repetição.

configurations

As configurações de modelagem a serem usadas no projeto.

As configurações individuais podem substituir os padrões por valores específicos da configuração. Para obter detalhes sobre como as variáveis são resolvidas, consulte Configurações.

<configuration_name>

O nome da configuração de modelagem.

Os nomes de configuração não diferenciam maiúsculas de minúsculas.

<variable_name>

O nome da variável.

Os nomes das variáveis devem seguir as regras de nomenclatura de variáveis do Python.

Todas as variáveis nas definições de projeto devem ser declaradas em padrões, na configuração selecionada ou em tempo de execução.

Se você quiser que as variáveis de cadeia de caracteres sejam resolvidas vazias, especifique-as como "".

<value>

O valor da variável.

Os valores podem ser cadeias de caracteres, números, boolianos, listas ou dicionários.

Os dicionários podem ser definidos no manifesto, mas não podem ser substituídos em tempo de execução.

Exemplo: manifest.yml

Este e um exemplo de arquivo de manifesto de DCM project (manifest.yml) que inclui três configurações, DEV, STAGE e PROD, com variáveis de modelo e os respectivos valores padrão:

manifest_version: 2

type: DCM_PROJECT

default_target: DCM_DEV

targets:
  DCM_DEV:
    account_identifier: MYORG-MYACCOUNT_DEV
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
    project_owner: DCM_DEVELOPER
    templating_config: DEV

  DCM_STAGE:
    account_identifier: MYORG-MYACCOUNT_STAGE
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_STG
    project_owner: DCM_STAGE_DEPLOYER
    templating_config: STAGE

  DCM_PROD:
    account_identifier: MYORG-MYACCOUNT_PROD
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_PROD
    project_owner: DCM_PROD_DEPLOYER
    templating_config: PROD

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "SMALL"

  configurations:
    DEV:
      env_suffix: "_DEV"
      user: "INSERT_YOUR_USER"
      wh_size: "X-SMALL"
      teams:
        - name: "DEV_TEAM"
          write_access: TRUE

    STAGE:
      env_suffix: "_STG"
      teams:
        - name: "TEST_TEAM_A"
          write_access: TRUE
        - name: "TEST_TEAM_B"
          write_access: FALSE

    PROD:
      env_suffix: ""
      teams:
        - name: "Marketing"
          write_access: FALSE
        - name: "Finance"
          write_access: FALSE
          wh_size: "LARGE"
        - name: "HR"
          write_access: FALSE
        - name: "IT"
          write_access: TRUE

Criar arquivos de definição de objeto

Um arquivo de definição de DCM project é um modelo resolvido como instruções SQL válidas para gerenciar objetos Snowflake. Cada DCM project requer pelo menos um arquivo de definição.

Você pode organizar suas definições de objetos e concessões em vários arquivos e pastas. A Snowflake recomenda escolher uma estrutura que represente a lógica de negócios do projeto (por exemplo, bronze, prata e ouro) em vez de agrupar por tipo de objeto.

Os arquivos de definição só podem conter instruções DEFINE, GRANT ou ATTACH. Outros comandos SQL não são compatíveis.

Para começar rapidamente a usar os DCM Projects, você pode converter seus scripts de implantação SQL existentes usando a palavra-chave DEFINE para as DDLs existentes (para tipos de objetos compatíveis).

A instrução DEFINE funciona como o comando CREATE OR ALTER <objeto>, mas com as seguintes diferenças importantes:

  • A ordem e o local das instruções DEFINE não importam. O Snowflake coleta e classifica todas as instruções de todos os arquivos de definição durante a execução do projeto.

  • Se você remover uma instrução DEFINE, o Snowflake descartará o objeto correspondente na próxima vez que você implantar o projeto.

  • Apenas um subconjunto de objetos Snowflake é permitido. Para obter mais detalhes, consulte Tipos de objetos compatíveis com DCM Projects.

  • Todos os objetos devem ser definidos com um nome totalmente qualificado no formato database.schema.object_name.

Os arquivos de definição podem conter várias opções de modelagem Jinja2 e oferecem suporte a recursos avançados de modelagem, que permitem que você faça o seguinte:

  • Personalize o conteúdo do arquivo em tempo de execução usando variáveis de modelo.

  • Use a sintaxe Jinja2 para lógica, como loops e condicionais.

  • Torne os arquivos de definição reutilizáveis e adaptáveis a diferentes cenários.

Modelagem de definição de objeto

Os DCM Projects são compatíveis com a estrutura Jinja2 para instruções de modelagem SQL. É possível declarar variáveis e atribuir valores usando a sintaxe Jinja2 de perfis de configuração, no comando EXECUTE DCM PROJECT, ou do Jinja. Você também pode construir loops usando listas de valores, instruções de caso, funções reutilizáveis e muito mais. Para obter mais informações, consulte a documentação do Jinja2.

As funcionalidades compatíveis do Jinja2 incluem:

  • Substituições de cadeia de caracteres

  • Listas

  • Dicionários e dicionários aninhados

  • Condições (instruções IF)

  • Looping

  • Macros globais e no arquivo

    • As macros definidas na pasta sources/macros podem ser usadas em todos os arquivos de definição.

    • As macros definidas em um arquivo podem ser usadas dentro do arquivo.

As funcionalidades incompatíveis do Jinja2 incluem:

Nota

O identificador _snow é reservado para uso futuro e não pode ser usado como nome de variável ou de macro

Importante

Não use as variáveis de modelagem dos DCM Projects para definições de objeto que contêm informações confidenciais ou credenciais. As definições SQL renderizadas não ocultam valores inseridos por variáveis de ambiente.

Da mesma forma, não insira dados pessoais, dados confidenciais, dados com controle de exportação ou outros dados regulamentados como metadados, por exemplo, nomes de arquivo, nomes de configuração e variável, ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

Veja a seguir um exemplo de arquivo de definição de DCM project que usa a modelagem Jinja2:

DEFINE WAREHOUSE DCM_PROJECT_WH_{{db}}
  WITH
    warehouse_size = '{{wh_size}}'
    auto_suspend = 300;

Veja a seguir um exemplo de arquivo de manifesto de DCM project (manifest.yml) que define duas configurações: DEV e PROD.

templating:
  configurations:
    DEV:
      db: "DEV_2"
      wh_size: "X-SMALL"
    PROD:
      db: "PROD"
      wh_size: "LARGE"

A renderização desta definição de warehouse com a configuração DEV (selecionada automaticamente por meio da templating_config de destino ou em tempo de execução) é resolvida como:

DEFINE WAREHOUSE DCM_PROJECT_WH_DEV_2
  WITH
    warehouse_size = "X-SMALL"
    auto_suspend = 300;

Macros

Arquivos de macros são todos os arquivos SQL localizados na pasta macros e suas subpastas. Eles só podem conter macros.

Um exemplo de uma estrutura de diretórios de um DCM project com arquivos de macros é:

My_dcm_project
 |_ manifest.yml
 |_ sources
    |_ definitions
       |_ my_definitions.sql
    |_ macros
       |_ my_global_macros.sql

Semelhante às funções nas linguagens de programação regulares, as macros ajudam a organizar as partes do código usadas com frequência em funções reutilizáveis, o que evita a repetição e segue o princípio DRY (Don’t Repeat Yourself). As macros nos DCM Projects funcionam da mesma forma que as macros Jinja2, com as seguintes exceções:

  • Local dedicado para arquivos de macros na pasta macros.

  • As macros definidas em arquivos de macros ficam automaticamente visíveis em outros arquivos de origem. A tag import do Jinja não é permitida.

  • A definição duplicada de uma macro com o mesmo nome é detectada e rejeitada.

Importação automática de macros globais

Durante o processo de renderização do arquivo de definição, os arquivos de origem são verificados em busca de possíveis chamadas de macro. Se uma macro chamada for definida em um arquivo de macros, a tag from […] import implícita será adicionada automaticamente, assim não há necessidade de uma importação explícita.

Semelhante às macros Jinja2, você pode definir uma macro local prefixando-a com um sublinhado. Uma macro local pode ser usada somente no arquivo onde foi declarada e não fica visível para outros arquivos.

Comentários de modelo

Nos comandos SQL, você pode adicionar -- antes do código para transformar a linha em comentário. O Jinja ainda processa as variáveis no código SQL, mas deixa os comentários SQL.

Por exemplo, o seguinte código Jinja:

-- hello {{ project_owner_role }}

É renderizado como:

-- hello DCM_DEVELOPER

Os comandos transformados em comentários não são executados em SQL. Você pode usar comentários de modelo para depurar a modelagem Jinja sem afetar seu código SQL.

Para ignorar o código Jinja durante a renderização, adicione # entre colchetes de abertura e fechamento, como mostrado no exemplo a seguir:

{# This Jinja comment will not appear in the rendered output. #}

Configurações

Ao usar modelos em suas definições de objeto, você tem as seguintes opções:

  • Atribuir valores a variáveis em tempo de execução.

  • Definir diferentes perfis de configuração em templating: configurations: no manifest.yml. Cada destino pode fazer referência a uma configuração por meio de templating_config. Consulte Configurações de modelagem de projeto para obter mais detalhes.

    Se os perfis de configuração forem definidos e um destino fizer referência a um deles por meio de templating_config, a configuração será aplicada automaticamente ao usar esse destino. Para exemplos, consulte Planejar um DCM project.

    O principal caso de uso dos perfis de configuração nos DCM Projects é para apontar ambientes diferentes. Os perfis de configuração permitem que você faça o seguinte:

    • Implante o mesmo código em vários ambientes.

    • Teste o código de produção em um ambiente que não seja de produção em escala reduzida.

    • Mantenha vários ambientes isolados na mesma conta.

    Nem todas as configurações de modelagem precisam ser referenciadas por um perfil de destino. Você pode manter configurações não usadas para alternar a configuração de modelagem em seu destino entre uma e outra.

  • Definir valores padrão compartilhados em templating: defaults: para evitar a repetição de variáveis comuns nas configurações. Consulte Configurações de modelagem de projeto para obter mais detalhes.

  • Substituir variáveis específicas por valores únicos em tempo de execução usando o sinalizador --variable na CLI.

As variáveis são resolvidas com uma hierarquia de três níveis: padrões globais < variáveis de configuração < variáveis de execução em tempo de execução.

Dicionários

A modelagem dos DCM Projects oferecem suporte a dicionários como valores de variáveis, permitindo uma configuração estruturada para implantações complexas multilocatário ou de vários recursos.

Ao agrupar os detalhes de configuração relacionados em dicionários, você obtém:

  • Controle granular: aplique configurações específicas, como tamanhos de warehouse, políticas de retenção e concessões, a recursos individuais sem escrever uma lógica exclusiva para cada variação.

  • Bases de código mais limpas: substitua scripts repetitivos embutidos em código por loops dinâmicos que se adaptam conforme a configuração.

  • Escalabilidade: integre novas equipes ou recursos adicionando entradas à sua configuração, em vez de refatorar pipelines de implantação.

Nota

Os dicionários podem ser definidos no manifesto, mas não podem ser substituídos em tempo de execução pelo sinalizador --variable ou por substituições de USING CONFIGURATION (...) em SQL. Somente valores escalares e listas podem ser substituídos em tempo de execução.

Exemplo de caso de uso para dicionários: Provisionamento de ambiente multilocatário

Considere uma plataforma compartilhada por vários departamentos, como marketing, finanças e HR, cada um com requisitos de conformidade e computação diferentes. Com os dicionários, você define uma única configuração que captura as necessidades de cada equipe.

Exemplo de manifesto:

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "X-SMALL"
  configurations:
    PROD:
      env_suffix: ""
      project_owner_role: "DCM_PROD_DEPLOYER"
      teams:
        - name: "Marketing"
          wh_size: "MEDIUM"
          data_retention_days: 14
          needs_sandbox_schema: true
        - name: "Finance"
          wh_size: "X-LARGE"
          data_retention_days: 90
          needs_sandbox_schema: false
        - name: "HR"
          data_retention_days: 30
          needs_sandbox_schema: false

Exemplo de definição:

O modelo SQL executa loop por este dicionário. Ele cria esquemas automaticamente, atribui a política de retenção correta e cria condicionalmente recursos extras apenas para as equipes que os solicitam.

-- loop through team dictionaries
{% for team in teams %}
    {% set team_name = team.name | upper %}

    -- inject dictionary values directly into object properties
    define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}
        comment = 'using JINJA dictionary values'
        data_retention_time_in_days = {{ team.data_retention_days }};

    -- pass the name to your macro
    {{ create_team_roles(team_name) }}

    define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.PRODUCTS(
        ITEM_NAME varchar,
        ITEM_ID varchar,
        ITEM_CATEGORY array
    )
    data_metric_schedule = 'TRIGGER_ON_CHANGES';

    {% if team_name == 'HR' %}
        define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.EMPLOYEES(
            NAME varchar,
            ID int
        )
        comment = 'This table is only created in HR';
    {% endif %}

    -- use dictionary booleans to deploy optional infrastructure
    {% if team.needs_sandbox_schema | default(false) %}
        define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}_SANDBOX
            comment = 'Sandbox schema defined via dictionary flag'
            data_retention_time_in_days = 1;
    {% endif %}

{% endfor %}