API brute
Méthode raw_query du Client
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
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
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
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 :
output.csv contenant le contenu suivant :
Cas d’usage multithread, multiprocessus et async/pilotés par événements
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
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
- Associer des paramètres ClickHouse spécifiques à plusieurs requêtes (voir les paramètres utilisateur). La commande ClickHouse
SETpermet de modifier les paramètres à l’échelle d’une session utilisateur. - Assurer le suivi des tables temporaires.
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 :
- Créez une instance
Clientdistincte 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 valeursSET). - Utilisez un
session_idunique pour chaque requête via l’argumentsettingslors de l’appel àquery,commandouinsert, si vous n’avez pas besoin d’un état de session partagé. - Désactivez les sessions sur un client partagé en définissant
autogenerate_session_id=Falseavant de créer le client (ou en le passant directement àget_client).
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
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 :
urllib3.