✅ 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 sera2023
.
📄 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) :
Type | Exemple dans vars: |
---|---|
chaîne | "France" ou 'Europe' |
booléen | true , false |
nombre | 2023 , 3.14 |
liste | [1, 2, 3] , ['A', 'B'] |
dictionnaire | { a: 1, b: 2 } |
null | null 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.