Skip to content

Adaptateur PostgreSQL

L'adaptateur PostgreSQL permet d'utiliser Noria avec une base de données PostgreSQL existante — idéal pour les pipelines de production, les entrepôts de données mutualisés, ou la migration depuis un ETL classique.

Installation

pip install "noria[postgres]"
# Installe psycopg2-binary en plus de noria

Configuration

database:
  dialect: postgresql
  host: localhost          # ou adresse du serveur
  port: 5432               # port par défaut PostgreSQL
  database: mon_entrepot   # nom de la base
  user: noria_user
  password: "${DB_PASSWORD}"    # depuis .noria/.env
  schema: public                # schéma par défaut (optionnel)

Avec une URL de connexion

Tu peux aussi utiliser une variable d'environnement contenant l'URL complète en passant par options :

# .noria/.env
PG_URL=postgresql://user:password@host:5432/database

Sécurité

Ne jamais stocker le mot de passe en clair dans noria.yml. Utilise toujours .noria/.env :

# .noria/.env  (ajouté dans .gitignore)
DB_HOST=pg.mycompany.internal
DB_USER=noria_prod
DB_PASSWORD=s3cr3t
DB_NAME=entrepot_prod
database:
  dialect: postgresql
  host: "${DB_HOST}"
  database: "${DB_NAME}"
  user: "${DB_USER}"
  password: "${DB_PASSWORD}"

Macros spécifiques PostgreSQL

Macro Résultat PostgreSQL
{{ cast('col', 'TEXT') }} col::TEXT
{{ cast('col', 'INTEGER') }} col::INTEGER
{{ date_trunc('month', 'col') }} DATE_TRUNC('month', col)
{{ current_timestamp() }} NOW()
{{ concat('a', 'b') }} CONCAT(a, b)
{{ to_char('col', 'YYYY-MM') }} TO_CHAR(col, 'YYYY-MM')

Syntaxe :: pour le cast

L'adaptateur PostgreSQL utilise la syntaxe native col::TYPE pour le cast — plus idiomatique et légèrement plus performante.

Schémas PostgreSQL

Noria crée automatiquement les schémas manquants via CREATE SCHEMA IF NOT EXISTS. Tu n'as pas besoin de les créer manuellement.

nodes:
  clients:
    target: "dwh.clients"   # Noria crée le schéma 'dwh' si absent
    output_write: replace

Fonctionnalités SQL PostgreSQL utiles

-- Générer des séries de dates
SELECT generate_series(
    '2024-01-01'::DATE,
    '2024-12-31'::DATE,
    INTERVAL '1 month'
)::DATE AS mois

-- JSON
SELECT
    data->>'nom'        AS nom,
    (data->>'age')::INT AS age
FROM clients_json

-- Tableaux
SELECT UNNEST(tags) AS tag FROM articles

-- Fonctions fenêtre (identiques à DuckDB)
SELECT
    client_id,
    ROW_NUMBER() OVER (PARTITION BY region ORDER BY ca DESC) AS rang
FROM stats

Pool de connexions

Noria utilise SQLAlchemy avec pool_pre_ping=True pour PostgreSQL — les connexions inactives sont vérifiées avant usage, ce qui évite les erreurs après une longue période d'inactivité.

Limitations

  • Seeds : les seeds utilisent les fonctions DuckDB (read_csv_auto, etc.). Pour charger un fichier en PostgreSQL, utilise un seed DuckDB intermédiaire puis copie vers PostgreSQL, ou charge directement avec COPY FROM dans un pre_hook.
  • Transactions : Noria exécute chaque tâche dans sa propre transaction implicite.