Aller au contenu
Transformation et modélisation

dbt : modèles, ref, sources et tests

dbt transforme des requêtes SELECT versionnées en tables ou vues, dans le bon ordre et avec des tests. On l'emploie pour organiser la couche de transformation d'un entrepôt en ELT.

  • dbt
  • model
  • ref
  • source
  • staging
  • marts
  • data_tests
  • jinja

Syntaxe

Modèle
models/├── staging/│   ├── _sources.yml         déclare les tables brutes│   └── stg_commandes.sql    1 modèle = 1 SELECT└── marts/    ├── _marts.yml           tests et documentation    └── fct_ventes_jour.sqlDans un modèle :  {{ source('nom_source', 'table') }}  lit une table brute déclarée  {{ ref('autre_modele') }}            lit un autre modèle et crée la dépendance  {{ config(materialized='table') }}   view, table, incremental ou ephemeralCommandes : dbt run (construit), dbt test (teste), dbt build (les deux, dans l'ordre du graphe)

Exemple

Exemple concret
-- models/staging/_sources.ymlversion: 2sources:  - name: boutique    schema: brut    tables:      - name: commandes-- models/staging/stg_commandes.sqlselect    cast(id as integer)        as commande_id,    lower(trim(statut))        as statut,    cast(montant as numeric)   as montant,    cast(cree_le as date)      as date_commandefrom {{ source('boutique', 'commandes') }}-- models/marts/fct_ventes_jour.sql{{ config(materialized='table') }}select date_commande, count(*) as nb_commandes, sum(montant) as cafrom {{ ref('stg_commandes') }}where statut = 'payee'group by date_commande-- models/marts/_marts.ymlversion: 2models:  - name: fct_ventes_jour    columns:      - name: date_commande        data_tests: [unique, not_null]-- dbt build --select +fct_ventes_jour-- Résultat attendu : stg_commandes est construit et testé d'abord,-- puis fct_ventes_jour, puis le test unique/not_null sur date_commande.-- Si un test échoue, dbt build saute les modèles qui en dépendent.

À retenir

  1. La couche staging colle à la source : une table par table brute, des renommages, des conversions de types, aucune jointure. Les règles métier vivent dans les marts.
  2. ref() résout aussi le schéma selon l'environnement : le même code écrit dans votre schéma de développement et dans celui de production, sans modification.
  3. Les tests génériques unique, not_null, accepted_values et relationships couvrent l'essentiel ; un test personnalisé est une requête qui doit renvoyer zéro ligne.
  4. Piège : écrire le nom de la table en dur (from brut.commandes) au lieu de source() ou ref(). dbt ne voit plus la dépendance, peut construire les modèles dans le mauvais ordre et le lignage devient faux.

Voir aussi