Skip to content

Adaptateur DuckDB

DuckDB est l'adaptateur par défaut de Noria. Il ne nécessite aucun serveur, aucune installation externe — il fonctionne directement depuis Python.

Pourquoi DuckDB ?

  • Zero-config : pas de serveur à démarrer, pas de port à ouvrir
  • Ultra-rapide : moteur colonnaire optimisé pour l'analytique
  • Lecture de fichiers native : CSV, Parquet, JSON directement en SQL
  • Compatible SQL standard : fenêtres, CTEs, PIVOT, UNPIVOT, QUALIFY…
  • Idéal pour le développement local et les pipelines data légers à moyens

Installation

DuckDB est inclus dans les dépendances de base de Noria :

pip install noria
# DuckDB est installé automatiquement

Configuration

Mode fichier (persistant)

database:
  dialect: duckdb
  database: data/warehouse.db   # chemin relatif à la racine du projet

Le fichier .db est créé automatiquement s'il n'existe pas. Les données persistent entre les exécutions.

Mode mémoire (éphémère)

database:
  dialect: duckdb
  database: ":memory:"   # défaut si database n'est pas précisé

Utile pour les tests et les pipelines qui ne nécessitent pas de persistance.

Macros spécifiques DuckDB

Ces macros ont une implémentation optimisée pour DuckDB :

Macro Résultat DuckDB
{{ cast('col', 'VARCHAR') }} CAST(col AS VARCHAR)
{{ date_trunc('month', 'col') }} DATE_TRUNC('month', col)
{{ current_timestamp() }} CURRENT_TIMESTAMP
{{ concat('a', 'b') }} CONCAT(a, b)
{{ to_char('col', 'YYYY-MM') }} STRFTIME(col, 'YYYY-MM')

STRFTIME vs TO_CHAR

DuckDB utilise STRFTIME(col, format) (ordre inversé de PostgreSQL). La macro {{ to_char() }} gère cette différence automatiquement.

Fonctionnalités SQL DuckDB utiles

DuckDB supporte nativement de nombreuses fonctions analytiques avancées :

-- Lecture directe de fichiers (utilisable dans les seeds ou les SQL)
SELECT * FROM read_csv_auto('data/input.csv')
SELECT * FROM read_parquet('data/export.parquet')
SELECT * FROM read_json_auto('data/data.json')

-- QUALIFY (filtre sur les fonctions fenêtre sans sous-requête)
SELECT *
FROM commandes
QUALIFY ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY date DESC) = 1

-- PIVOT natif
SELECT *
FROM (SELECT mois, region, ca FROM stats)
PIVOT (SUM(ca) FOR region IN ('nord', 'sud', 'est', 'ouest'))

-- UNPIVOT
SELECT *
FROM large_table
UNPIVOT (valeur FOR indicateur IN (col_a, col_b, col_c))

-- Échantillonnage
SELECT * FROM ma_table USING SAMPLE 10%
SELECT * FROM ma_table USING SAMPLE 1000 ROWS

Seeds avec DuckDB

DuckDB est particulièrement puissant pour les seeds car il lit les fichiers nativement :

nodes:
  seed_ventes:
    type: seed
    seed_file: data/ventes_2024.csv
    target: main.ventes_brut
nodes:
  seed_parquet:
    type: seed
    seed_file: exports/snapshot.parquet
    target: main.snapshot

Limitations

  • Pas de multi-utilisateurs concurrent : DuckDB fichier ne supporte qu'une connexion en écriture à la fois.
  • Pas adapté à la production web : préférer PostgreSQL pour les applications multi-utilisateurs.
  • Taille : performant jusqu'à plusieurs dizaines de GB — au-delà, envisager PostgreSQL ou BigQuery.