Skip to main content

API brute

Pour les cas d’utilisation qui ne nécessitent aucune transformation entre les données ClickHouse et des types de données ou structures natifs ou tiers, le client ClickHouse Connect fournit des méthodes permettant d’utiliser directement la connexion à ClickHouse.

Méthode raw_query du Client

La méthode Client.raw_query permet d’utiliser directement l’interface de requête HTTP de ClickHouse via la connexion du client. La valeur renvoyée est un objet bytes brut. Elle fournit un wrapper pratique avec liaison des paramètres, gestion des erreurs, nouvelles tentatives et gestion des paramètres, au moyen d’une interface minimale : Il revient à l’appelant de gérer l’objet bytes renvoyé. Notez que Client.query_arrow n’est qu’un fin wrapper autour de cette méthode, utilisant le format de sortie ClickHouse Arrow.

Méthode raw_stream du Client

La méthode Client.raw_stream possède la même API que la méthode raw_query, mais elle renvoie un objet io.IOBase pouvant être utilisé comme générateur ou source de flux d’objets bytes. Elle est actuellement utilisée par la méthode query_arrow_stream.

Méthode raw_insert de Client

La méthode Client.raw_insert permet d’effectuer des insertions directes d’objets bytes ou de générateurs d’objets bytes via la connexion du client. Comme elle n’effectue aucun traitement de la charge utile d’insertion, elle offre d’excellentes performances. Cette méthode propose des options pour spécifier les paramètres et le format d’insertion : Il revient à l’appelant de s’assurer que insert_block est dans le format spécifié et utilise la méthode de compression indiquée. ClickHouse Connect utilise ces insertions directes pour les téléversements de fichiers et les tables PyArrow, en déléguant l’analyse au serveur ClickHouse.

Enregistrer les résultats de la requête dans des fichiers

Vous pouvez transférer des fichiers directement depuis ClickHouse vers le système de fichiers local à l’aide de la méthode raw_stream. Par exemple, si vous souhaitez enregistrer le résultat d’une requête dans un fichier CSV, vous pouvez utiliser l’extrait de code suivant :
Le code ci-dessus produit un fichier output.csv contenant le contenu suivant :
De même, vous pouvez enregistrer les données au format TabSeparated, ainsi que dans d’autres formats. Consultez Formats des données d’entrée et de sortie pour une vue d’ensemble de tous les formats disponibles.

Cas d’usage multithread, multiprocessus et async/pilotés par événements

ClickHouse Connect fonctionne bien dans les applications multithread, multiprocessus et async/pilotées par événements. Tout le traitement des requêtes et des insertions s’effectue dans un seul thread, de sorte que les opérations sont généralement thread-safe. (Le traitement parallèle de certaines opérations à bas niveau constitue une amélioration possible à l’avenir pour surmonter le surcoût de performance lié à un seul thread, mais même dans ce cas, le caractère thread-safe sera maintenu.) Comme chaque requête ou insertion exécutée conserve son état dans son propre objet QueryContext ou InsertContext, respectivement, ces objets auxiliaires ne sont pas thread-safe et ne doivent pas être partagés entre plusieurs flux de traitement. Consultez également la discussion sur les objets de contexte dans les sections QueryContexts et InsertContexts. De plus, dans une application qui a au moins deux requêtes et/ou insertions « en cours » en même temps, il y a deux autres points à garder à l’esprit. Le premier est la « session » ClickHouse associée à la requête/insertion, et le second est le pool de connexions HTTP utilisé par les instances de ClickHouse Connect Client.

Wrapper pour AsyncClient

ClickHouse Connect fournit un wrapper async autour du Client standard, ce qui permet d’utiliser le client dans un environnement asyncio. Pour obtenir une instance d’AsyncClient, vous pouvez utiliser la fonction de fabrique get_async_client, qui accepte les mêmes paramètres que get_client :
AsyncClient possède les mêmes méthodes et les mêmes paramètres que le Client standard, mais il s’agit de coroutines lorsque c’est applicable. En interne, les méthodes du Client qui effectuent des opérations d’IO sont encapsulées dans un appel à run_in_executor. Les performances en mode multithread s’améliorent avec le wrapper AsyncClient, car les execution threads et le GIL sont libérés pendant l’attente de la fin des opérations d’IO. Note : contrairement au Client classique, AsyncClient force autogenerate_session_id à False par défaut. Voir aussi : exemple run_async.

Gestion des ID de session ClickHouse

Chaque requête ClickHouse s’exécute dans le contexte d’une « session » ClickHouse. Les sessions sont actuellement utilisées à deux fins :
  • Associer des paramètres ClickHouse spécifiques à plusieurs requêtes (voir les paramètres utilisateur). La commande ClickHouse SET permet de modifier les paramètres à l’échelle d’une session utilisateur.
  • Assurer le suivi des tables temporaires.
Par défaut, chaque requête exécutée avec une instance Client de ClickHouse Connect utilise l’ID de session de ce client. Les instructions SET et les tables temporaires fonctionnent comme prévu lorsqu’un seul client est utilisé. En revanche, le serveur ClickHouse n’autorise pas les requêtes concurrentes au sein d’une même session (le client générera une ProgrammingError si vous essayez de le faire). Pour les applications qui exécutent des requêtes concurrentes, utilisez l’un des modèles suivants :
  1. Créez une instance Client distincte pour chaque thread/processus/gestionnaire d’événements nécessitant une isolation de session. Cela préserve l’état de session propre à chaque client (tables temporaires et valeurs SET).
  2. Utilisez un session_id unique pour chaque requête via l’argument settings lors de l’appel à query, command ou insert, si vous n’avez pas besoin d’un état de session partagé.
  3. Désactivez les sessions sur un client partagé en définissant autogenerate_session_id=False avant de créer le client (ou en le passant directement à get_client).
Vous pouvez également passer autogenerate_session_id=False directement à get_client(...). Dans ce cas, ClickHouse Connect n’envoie pas de session_id ; le serveur ne considère pas que des requêtes distinctes appartiennent à la même session. Les tables temporaires et les paramètres au niveau de la session ne persistent pas d’une requête à l’autre.

Personnalisation du pool de connexions HTTP

ClickHouse Connect utilise les pools de connexions urllib3 pour gérer la connexion HTTP sous-jacente avec le serveur. Par défaut, toutes les instances client partagent le même pool de connexions, ce qui suffit dans la majorité des cas d’usage. Ce pool par défaut maintient jusqu’à 8 connexions HTTP Keep Alive vers chaque serveur ClickHouse utilisé par l’application. Pour les applications volumineuses multithreadées, il peut être préférable d’utiliser des pools de connexions distincts. Des pools de connexions personnalisés peuvent être fournis via l’argument nommé pool_mgr de la fonction principale clickhouse_connect.get_client :
Comme le montre l’exemple ci-dessus, les clients peuvent partager un même PoolManager, ou un PoolManager distinct peut être créé pour chaque client. Pour plus de détails sur les options disponibles lors de la création d’un PoolManager, consultez la documentation urllib3.
Dernière modification le 23 juillet 2026