C’est la capacité de dbt à savoir quelle colonne source alimente quelle colonne cible, dans un modèle donné.
Cela permet :
- de documenter les colonnes,
- de voir l’impact d’un changement en amont,
- d’avoir une vue claire dans dbt docs du flux de données colonne par colonne (et pas juste table à table).
⚠️ Problème avec SELECT *
Quand tu fais un :
select * from {{ ref('stg_ventes') }}
dbt ne peut pas deviner quelles colonnes tu as sélectionnées, ni comment elles sont transformées.
Le
*
est un alias : il signifie “toutes les colonnes”, mais dbt ne voit pas la liste réelle tant que ce n’est pas exécuté dans la base.
Et dbt ne devine pas dynamiquement les schémas des tables pendant la compilation.
📉 Conséquence
- dbt ne peut pas générer la lineage par colonne
- dans
dbt docs
, tu verras la relation entre les modèles, mais pas entre les colonnes - tu perds la possibilité de documenter et tracer les dépendances précises
✅ Bonne pratique : toujours lister explicitement les colonnes
select
id_vente,
produit,
date_vente,
montant
from {{ ref('stg_ventes') }}
Grâce à ça, dbt :
- sait que
id_vente
du modèle vient destg_ventes.id_vente
- peut documenter chaque colonne
- peut propager des descriptions avec le
+copy_metadata: true
🧪 Exemple visuel dans dbt docs
Avec SELECT * | Avec SELECT col1, col2... |
---|---|
fact_ventes dépend de stg_ventes | ✅ fact_ventes.date_vente ← stg_ventes.date_vente |
❌ Pas de trace colonne par colonne | ✅ Traçabilité précise ligne à ligne |
🧼 Règle à retenir
❌ Évite
SELECT *
dans les modèles dbt,
✅ PréfèreSELECT col1, col2, …
même si c’est plus verbeux.