Passer au contenu principal

Insertion de données avec ClickHouse Connect : utilisation avancée

InsertContexts

ClickHouse Connect exécute toutes les insertions dans un InsertContext. L’InsertContext inclut toutes les valeurs transmises comme arguments à la méthode client insert. De plus, lors de la création initiale d’un InsertContext, ClickHouse Connect récupère les types de données des colonnes à insérer, nécessaires à des insertions efficaces au format Native. En réutilisant l’InsertContext pour plusieurs insertions, cette « pré-requête » est évitée, ce qui rend les insertions plus rapides et plus efficaces. Il est possible d’obtenir un InsertContext à l’aide de la méthode client create_insert_context. Cette méthode prend les mêmes arguments que la fonction insert. Notez que seule la propriété data des InsertContext doit être modifiée en vue d’une réutilisation. Cela correspond à son objectif : fournir un objet réutilisable pour des insertions répétées de nouvelles données dans la même table.
InsertContexts incluent un état mutable mis à jour pendant le processus d’insertion ; ils ne sont donc pas thread-safe.

Formats d’écriture

Les formats d’écriture ne sont actuellement implémentés que pour un nombre limité de types. Dans la plupart des cas, ClickHouse Connect essaie de déterminer automatiquement le format d’écriture approprié pour une colonne en examinant le type de la première valeur de données non nulle. Par exemple, lors d’une insertion dans une colonne DateTime, si la première valeur insérée dans la colonne est un entier Python, ClickHouse Connect insérera directement cette valeur en partant du principe qu’il s’agit en fait d’un timestamp Unix en secondes. Dans la plupart des cas, il n’est pas nécessaire de redéfinir le format d’écriture d’un type de données, mais les méthodes associées du paquet clickhouse_connect.datatypes.format peuvent être utilisées pour le faire au niveau global.

Options de format d’écriture

Méthodes d’insertion spécialisées

ClickHouse Connect fournit des méthodes d’insertion spécialisées pour les formats de données courants :
  • insert_df — Insère un Pandas DataFrame. Au lieu d’un argument data de type Python Sequence of Sequences, le deuxième paramètre de cette méthode attend un argument df, qui doit être une instance de Pandas DataFrame. ClickHouse Connect traite automatiquement le DataFrame comme une source de données orientée colonnes ; le paramètre column_oriented n’est donc ni nécessaire ni disponible.
  • insert_arrow — Insère une PyArrow Table. ClickHouse Connect transmet la table Arrow telle quelle au serveur ClickHouse pour traitement ; seuls les arguments database et settings sont donc disponibles en plus de table et arrow_table.
  • insert_df_arrow — Insère un Pandas DataFrame adossé à Arrow ou un Polars DataFrame. ClickHouse Connect détermine automatiquement si le DataFrame est de type Pandas ou Polars. S’il s’agit d’un DataFrame Pandas, une validation est effectuée pour vérifier que le backend Dtype de chaque colonne repose sur Arrow, et une erreur est générée dans le cas contraire.
Un tableau NumPy est une Sequence of Sequences valide et peut être utilisé comme argument data avec la méthode insert principale ; une méthode spécialisée n’est donc pas nécessaire.

Insertion de DataFrame Pandas

Insertion d’une table PyArrow

Insertion d’un DataFrame basé sur Apache Arrow (pandas 2.x)

Fuseaux horaires

Lors de l’insertion d’objets Python datetime.datetime dans des colonnes ClickHouse DateTime ou DateTime64, ClickHouse Connect gère automatiquement les informations de fuseau horaire. Comme ClickHouse stocke en interne toutes les valeurs DateTime sous forme de timestamps Unix sans fuseau horaire (secondes ou fractions de seconde depuis l’époque Unix), la conversion de fuseau horaire s’effectue automatiquement côté client lors de l’insertion.

Objets datetime avec fuseau horaire

Si vous insérez un objet Python datetime.datetime avec fuseau horaire, ClickHouse Connect appellera automatiquement .timestamp() pour le convertir en timestamp Unix, ce qui prend correctement en compte le décalage horaire. Cela signifie que vous pouvez insérer des objets datetime de n’importe quel fuseau horaire, et qu’ils seront correctement stockés sous la forme de leur timestamp UTC équivalent.
Dans cet exemple, les trois objets datetime représentent chacun un instant différent, car ils ont des fuseaux horaires différents. Chacun sera correctement converti en timestamp Unix correspondant et stocké dans ClickHouse.
Avec pytz, vous devez utiliser la méthode localize() pour associer des informations de fuseau horaire à un datetime naïf. Si vous passez directement tzinfo= au constructeur datetime, des décalages historiques incorrects seront utilisés. Pour UTC, tzinfo=pytz.UTC fonctionne correctement. Consultez la documentation de pytz pour plus d’informations.

Objets datetime sans information de fuseau horaire

Si vous insérez un objet Python datetime.datetime sans information de fuseau horaire (c’est-à-dire sans tzinfo), la méthode .timestamp() l’interprétera comme appartenant au fuseau horaire local du système. Pour éviter toute ambiguïté, il est recommandé de :
  1. Toujours utiliser des objets datetime avec fuseau horaire lors de l’insertion, ou
  2. Vous assurer que le fuseau horaire de votre système est défini sur UTC, ou
  3. Convertir manuellement en horodatages epoch avant l’insertion

Colonnes DateTime avec des métadonnées de fuseau horaire

Les colonnes ClickHouse peuvent être définies avec des métadonnées de fuseau horaire (par exemple, DateTime('America/Denver') ou DateTime64(3, 'Asia/Tokyo')). Ces métadonnées n’affectent pas la façon dont les données sont stockées (elles restent des timestamps UTC), mais elles déterminent le fuseau horaire utilisé lorsque vous interrogez les données dans ClickHouse. Lors de l’insertion dans de telles colonnes, ClickHouse Connect convertit votre objet datetime Python en timestamp Unix (en tenant compte de son fuseau horaire, le cas échéant). Lorsque vous récupérez ensuite les données, ClickHouse Connect renvoie le datetime converti dans le fuseau horaire de la colonne, quel que soit le fuseau horaire utilisé lors de l’insertion.

Insertions à partir de fichiers

Le paquet clickhouse_connect.driver.tools inclut la méthode insert_file, qui permet d’insérer des données directement depuis le système de fichiers dans une table ClickHouse existante. L’interprétation des données est déléguée au serveur ClickHouse. insert_file accepte les paramètres suivants : Pour les fichiers contenant des données incohérentes ou des valeurs de date/heure dans un format inhabituel, les paramètres applicables aux importations de données (tels que input_format_allow_errors_num et input_format_allow_errors_num) sont pris en charge par cette méthode.
Dernière modification le 2 juillet 2026