Les variables avec dbt


✅ 1. Les variables var() dans dbt

Dans dbt, tu peux définir des variables personnalisées dans ton projet (généralement dans dbt_project.yml) ou dans ton environnement d’exécution (via dbt run --vars), et tu peux y accéder dans tes modèles ou macros avec la fonction Jinja var('nom').


📁 2. Où définir les variables ?

🔹 A. Dans dbt_project.yml (au niveau du projet)

# dbt_project.yml
name: mon_projet
version: '1.0'

vars:
  include_region_filter: true
  annee_reference: 2024

🔹 B. Ou dynamiquement en ligne de commande (prend le dessus sur le yml) :

dbt run --vars '{"include_region_filter": true, "annee_reference": 2024}'

🧩 3. Comment utiliser var() dans le code dbt ?

📄 Exemple dans un modèle :

select *
from {{ ref('stg_ventes') }}
where annee = {{ var('annee_reference', 2023) }}

Ici, si annee_reference n’est pas défini, la valeur par défaut sera 2023.


📄 Exemple dans une macro conditionnelle :

{% if var('include_region_filter', false) %}
    AND region = 'Europe'
{% endif %}

📌 Bonnes pratiques

  • Définis toutes tes variables attendues dans dbt_project.yml avec une valeur par défaut.
  • Utilise la syntaxe var('nom', valeur_par_défaut) pour éviter les erreurs si la variable est absente.
  • Tu peux aussi typer les variables dans des macros : booléens, chaînes, listes, etc.


Le typage

Dans dbt, les variables que tu accèdes via var('nom') sont dynamiquement typées, car elles sont en fait des objets YAML. Il n’y a pas de système de typage explicite comme dans TypeScript ou Python, mais tu peux gérer leur type à la main dans tes macros Jinja.


✅ 1. Types supportés (car YAML les supporte) :

TypeExemple dans vars:
chaîne"France" ou 'Europe'
booléentrue, false
nombre2023, 3.14
liste[1, 2, 3], ['A', 'B']
dictionnaire{ a: 1, b: 2 }
nullnull ou non défini

✅ 2. Typage manuel avec Jinja

Tu peux écrire des vérifications de type dans tes macros :

Exemple : vérifier si une variable est un booléen

{% set value = var('include_region_filter', false) %}

{% if value is boolean %}
    -- ok
{% else %}
    {% do exceptions.raise("La variable 'include_region_filter' doit être un booléen.") %}
{% endif %}

Exemple : liste de strings

{% set produits = var('produits_exclus', []) %}

{% if produits is iterable and produits | length > 0 %}
    AND product NOT IN (
        {% for p in produits %}
            '{{ p }}'{% if not loop.last %},{% endif %}
        {% endfor %}
    )
{% endif %}

✅ 3. Astuce : forcer un type par conversion

-- Forcer un entier
{% set annee = var('annee_reference', '2024') | int %}

✅ 4. Vérification d’un dictionnaire avec clé obligatoire

{% set config = var('reporting_config', {}) %}

{% if 'year' not in config or 'region' not in config %}
    {% do exceptions.raise("Les clés 'year' et 'region' sont requises dans reporting_config.") %}
{% endif %}

En résumé

  • Tu ne déclares pas un type dans le YAML.
  • Tu contrôles le type à l’exécution dans les macros avec des tests is boolean, is iterable, is string, etc.
  • Tu peux utiliser les filtres Jinja comme int, float, string, length, etc. pour caster si besoin.

Leave a Reply

Your email address will not be published. Required fields are marked *