veilletech.fr
27 oct. Feed du jour
#09 DUCKDB Article

DuckDB 2.0 : appender Python, vues sécurisées

Une vue qui filtre ne cache pas forcément ce qu'elle filtre.

Cinq jours après DuckDB 2.0 LTS, l'équipe détaille des changements absents de l'annonce : un appender pour le client Python, CREATE SECURE VIEW qui n'expose pas les lignes filtrées via stats() ni EXPLAIN ANALYZE, et l'option PARTITION_PATH de COPY pour nommer les partitions. SHOW sur une table est déprécié au profit de DESCRIBE.

2 min de lectureintermédiairevidéo 1:16
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. L'appender du client Python
  3. CREATE SECURE VIEW
  4. PARTITION_PATH et ORDER_BY pour COPY
  5. Ce qui est déprécié, ce qui s'ajoute
  6. À retenir

Ce qui se passe

DuckDB 2.0.0 LTS est sorti le 21 octobre (triggers, VARIANT, E/S asynchrones : voir la fiche du 22 octobre). Le 26, l'équipe a détaillé les améliorations plus petites qui n'avaient pas leur place dans l'annonce. Trois touchent le code du quotidien.

L'appender du client Python

Insérer ligne par ligne est lent, et un gros INSERT est pénible à construire. L'appender, déjà présent dans plusieurs clients (C/C++, Go, Java), manquait à Python. Il accumule les lignes et les écrit en une seule opération ; le bloc with les vide à sa sortie.

Python
import duckdb

con = duckdb.connect()
con.execute("CREATE TABLE events (kind VARCHAR, n INTEGER)")

with con.appender("events") as appender:
    appender.append_row("login", 1)
    appender.append_rows([("logout", 2), ("login", 3)])

Pour des données déjà dans un DataFrame ou une table Arrow, INSERT INTO ... SELECT reste plus rapide : l'appender sert aux lignes que votre code produit au fil de l'eau.

CREATE SECURE VIEW

Une vue ordinaire peut trahir les lignes qu'elle filtre, par les statistiques (fonction stats()) ou par le plan d'exécution. Une vue sécurisée n'expose ni l'un ni l'autre : stats() ne rend que des statistiques sans information, et EXPLAIN ANALYZE affiche un seul nœud Secure View au lieu du plan de la vue.

SQL
CREATE SECURE VIEW public_clients AS
    SELECT name
    FROM clients
    WHERE tier = 'public';

PARTITION_PATH et ORDER_BY pour COPY

PARTITION_BY écrit un sous-dossier colonne=valeur par partition, à la manière de Hive. PARTITION_PATH donne la main sur le chemin, par une expression sur les colonnes de partition :

SQL
COPY sales TO 'sales_out'
    (FORMAT parquet,
     PARTITION_BY (year),
     PARTITION_PATH CASE
         WHEN year < 2022 THEN 'cold/' || year
         ELSE 'hot/' || year
     END);

L'expression est évaluée une fois par partition ; son résultat doit être un chemin relatif sans segment .., et chaque partition doit aboutir à un chemin distinct. L'option ORDER_BY trie les lignes avant l'écriture, à l'intérieur de chaque partition quand elle accompagne PARTITION_BY.

Ce qui est déprécié, ce qui s'ajoute

Source : DuckDB, 26 octobre 2026. Source en anglais.