Skip to main content

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

InsertContexts

ClickHouse Connect exécute les insertions au format Native, c’est-à-dire les méthodes insert et insert_df, dans un InsertContext. Les méthodes insert_arrow, insert_df_arrow et raw_insert envoient directement leurs payloads et n’en utilisent pas. 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, à l’exception de context lui-même. 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 sont implémentés pour un nombre limité de types. Dans la plupart des cas, ClickHouse Connect détermine automatiquement le format d’écriture approprié pour une colonne à partir de sa première valeur de données non nulle. Par exemple, lorsque la première valeur d’une colonne DateTime est un entier, le client la traite comme un nombre de secondes depuis l’époque Unix. Il n’est généralement pas nécessaire de remplacer un format d’écriture, mais les méthodes de clickhouse_connect.datatypes.format permettent d’en définir un globalement. Les wrappers de conteneur tels que Array, Nullable et LowCardinality conservent le comportement de mise en forme du type d’élément.

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 comme données Native orientées colonnes. Il prend également en charge des noms/types de colonnes explicites ou un InsertContext réutilisable.
  • insert_arrow — Insère une PyArrow Table à l’aide du format d’entrée Arrow de ClickHouse.
  • insert_df_arrow — Insère un Pandas DataFrame adossé à Arrow ou un Polars DataFrame. Les colonnes Pandas doivent toutes utiliser des Dtype adossés à Arrow.
Les trois méthodes acceptent database, settings et les transport_settings HTTP par requête.
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 adossé à Arrow (pandas 2.x)

Créer une table à partir d’un schéma PyArrow

create_table_from_arrow_schema génère une instruction CREATE TABLE à partir de champs scalaires Arrow courants. La correspondance couvre les entiers signés et non signés, les valeurs à virgule flottante, les booléens, les chaînes, les dates et les horodatages. Elle crée intentionnellement des colonnes ClickHouse non Nullable et lève une exception TypeError pour les types Arrow non pris en charge. Passez en revue le DDL généré avant de l’exécuter.

Fuseaux horaires

Lors de l’insertion d’objets Python datetime dans des colonnes DateTime ou DateTime64, ClickHouse Connect les convertit en valeurs d’époque Unix.

Objets datetime avec informations de fuseau horaire

Les objets avec informations de fuseau horaire préservent l’instant représenté. Il n’est pas nécessaire que le fuseau horaire source corresponde à celui déclaré sur la colonne ClickHouse.
ClickHouse Connect utilise le module zoneinfo de la bibliothèque standard. Le driver ne dépend plus de pytz.

Objets datetime sans fuseau horaire

Le paramètre global naive_datetime_insert contrôle l’insertion d’objets Python natifs contenant des valeurs datetime sans fuseau horaire. Il s’applique également aux chaînes ISO sans fuseau horaire acceptées par les colonnes DateTime64.
  • "local" est la valeur par défaut dans la version 1.x. Python interprète la valeur dans le fuseau horaire du processus lors de l’appel à .timestamp(). Cela préserve le comportement existant.
  • "server" interprète la valeur comme une heure locale dans le fuseau horaire déclaré par la colonne DateTime ou DateTime64. Si la colonne n’a pas de fuseau horaire, le fuseau horaire du serveur communiqué lors de la connexion du client est utilisé.
Définissez l’option avant une insertion. Elle est lue lors de la sérialisation de chaque colonne d’insertion native contenant des objets Python datetime ou des chaînes ISO DateTime64 ; la modification s’applique donc aux clients existants et aux contextes d’insertion réutilisables.
Avec "server", ClickHouse Connect associe le tzinfo cible avant de convertir la valeur en époque Unix. Pour les fuseaux horaires IANA, il suit les règles de la bibliothèque standard pour les transitions vers ou depuis l’heure d’été. En cas de chevauchement à l’automne, la valeur fold du datetime est utilisée. Par défaut, fold=0 sélectionne le décalage avant la transition, tandis que fold=1 sélectionne celui après la transition. En cas de lacune au printemps, la même sélection de décalage est utilisée, sans rejet ni normalisation. Les heures locales inexistantes lors d’une lacune printanière peuvent ne pas effectuer d’aller-retour via un paramètre de requête en mode wall, car l’analyse de texte de ClickHouse peut sélectionner un décalage différent. Utilisez un datetime avec fuseau horaire ou une heure locale valide lorsque l’instant est important. L’option s’applique uniquement aux insertions natives d’objets Python datetime et aux chaînes ISO sans fuseau horaire acceptées par DateTime64. Les colonnes NumPy et Pandas de type datetime64 sans fuseau horaire conservent leur conversion existante des heures locales UTC. Pour représenter un instant précis indépendamment de l’un ou l’autre mode, associez le fuseau horaire souhaité ou fournissez explicitement un entier époque Unix.
Les paramètres de requête datetime sans fuseau horaire utilisent le paramètre distinct naive_datetime_binding. Son mode par défaut, "wall", envoie les champs tels quels, sans conversion vers le fuseau horaire local de l’hôte. Consultez la section Argument Parameters.

Colonnes DateTime avec métadonnées de fuseau horaire

Les colonnes ClickHouse peuvent déclarer des métadonnées de fuseau horaire, par exemple DateTime('America/Denver') ou DateTime64(3, 'Asia/Tokyo'). Ces métadonnées déterminent la manière dont les valeurs sont affichées lors de l’exécution d’une requête. Lors de l’insertion d’une valeur avec fuseau horaire, ClickHouse Connect préserve l’instant représenté. Pour une valeur sans fuseau horaire, le paramètre naive_datetime_insert détermine si le fuseau horaire du processus ou celui de la colonne est utilisé. Lors d’une requête, le résultat utilise le fuseau horaire de la colonne, sauf si une substitution par colonne est fournie via l’argument column_tzs. L’argument query_tz ne remplace pas le fuseau horaire déclaré pour une colonne.

Insertions de fichiers

clickhouse_connect.driver.tools.insert_file transmet en flux un fichier local vers une table existante et confie l’analyse à ClickHouse. Les paramètres du format d’entrée, tels que input_format_allow_errors_ratio et input_format_allow_errors_num, peuvent être transmis via settings.
Pour un AsyncClient, utilisez await avec insert_file_async en passant les mêmes arguments :
L’utilitaire asynchrone lit le fichier dans un thread worker avant d’attendre raw_insert, de sorte que le contenu du fichier reste en mémoire.
Dernière modification le 14 août 2026