Utilisez des arguments nommés pour les fabriques de clients et les méthodes comportant de nombreux paramètres facultatifs.Les méthodes qui ne sont pas documentées ici ne sont pas considérées comme faisant partie de l’API et peuvent être supprimées ou modifiées.
Initialisation du client
Utilisezclickhouse_connect.get_client pour créer un Client synchrone, ou installez l’extra async et attendez clickhouse_connect.get_async_client pour créer un AsyncClient natif.
Arguments de connexion
Les fabriques HTTP synchrones et asynchrones convertissent les valeurs de type chaîne issues des paramètres de requête du DSN ou de
generic_args pour les options de client suivantes : connect_timeout, send_receive_timeout, query_limit et query_retries sont converties dans les types numériques indiqués ci-dessus ; autogenerate_query_id, autogenerate_session_id et form_encode_query_params sont converties en booléens. Toute valeur de type chaîne invalide pour ces options lève une ProgrammingError.
La fabrique asynchrone accepte également connector_limit=100, connector_limit_per_host=20 et keepalive_timeout=30.0 pour configurer son pool de connexions aiohttp. Vous pouvez les transmettre directement comme arguments nommés, comme paramètres de requête du DSN ou via generic_args, utilisé en interne pour les connect_args de SQLAlchemy. Les valeurs de type chaîne de ces options de connector sont converties dans les types numériques documentés. Toute valeur de type chaîne invalide pour ces options lève une ProgrammingError. Les arguments nommés explicites différents de None ont préséance sur generic_args, qui a lui-même préséance sur le DSN. La fabrique asynchrone n’accepte pas pool_mgr. Le backend chDB synchrone accepte path et chdb_options ; voir Backend chDB intégré.
Arguments HTTPS/TLS
Argument settings
Enfin, l’argument settings de get_client permet de transmettre au serveur des settings ClickHouse supplémentaires pour chaque requête client. Notez que, dans la plupart des cas, les utilisateurs disposant d’un accès readonly=1 ne peuvent pas modifier les settings envoyés avec une requête ; ClickHouse Connect supprimera donc ces settings de la requête finale et consignera un avertissement. Les settings suivants s’appliquent uniquement aux requêtes/sessions HTTP utilisées par ClickHouse Connect et ne sont pas documentés comme des settings généraux de ClickHouse.
Pour les autres settings ClickHouse pouvant être envoyés avec chaque requête, consultez la documentation ClickHouse.
Exemples de création de client
- Sans paramètre, un client ClickHouse Connect se connecte au port HTTP par défaut sur
localhost, avec l’utilisateur par défaut et sans mot de passe :
- Connexion à un serveur ClickHouse externe sécurisé (HTTPS)
- Connexion avec un ID de session, d’autres paramètres de connexion personnalisés et des settings de ClickHouse.
Backend chDB intégré
Installezclickhouse-connect[chdb] pour utiliser le backend chDB expérimental intégré au processus. Il expose les méthodes synchrones query, insert, streaming et Arrow du client :
path="/data/my_chdb" ou utilisez dsn="chdb:///data/my_chdb" pour bénéficier d’un stockage persistant. Le backend n’autorise qu’un seul path de moteur par processus et ne prend pas en charge get_async_client ni les données externes.
Cycle de vie du client et bonnes pratiques
Créer un client ClickHouse Connect est une opération coûteuse, car elle implique l’établissement d’une connexion, la récupération des métadonnées du serveur et l’initialisation des paramètres. Suivez ces bonnes pratiques pour obtenir des performances optimales :Principes fondamentaux
- Réutilisez les clients : créez les clients une seule fois au démarrage de l’application et réutilisez-les pendant toute sa durée de vie
- Évitez les créations fréquentes : ne créez pas de nouveau client pour chaque requête ou demande
- Nettoyez correctement : fermez toujours les clients lors de l’arrêt afin de libérer les ressources du pool de connexions
- Partagez quand c’est possible : un seul client peut gérer de nombreuses requêtes concurrentes grâce à son pool de connexions (voir les remarques sur les threads ci-dessous)
Quelques principes de base
Réutiliser un seul client :Applications multithreadées
Pour partager un client entre plusieurs threads en toute sécurité :Nettoyage approprié
Fermez toujours les clients lors de l’arrêt. Notez queclient.close() libère le client et ferme les connexions HTTP du pool uniquement lorsque le client possède son propre gestionnaire de pool (par exemple, s’il a été créé avec des options TLS/proxy personnalisées). Pour le pool partagé par défaut, utilisez client.close_connections() pour fermer explicitement les sockets ; sinon, les connexions sont récupérées automatiquement à l’expiration de l’inactivité et à la fin du processus.
Quand utiliser plusieurs clients
L’utilisation de plusieurs clients est appropriée dans les cas suivants :- Serveurs différents : un client par serveur ClickHouse ou cluster
- Identifiants différents : des clients distincts pour différents utilisateurs ou niveaux d’accès
- Bases de données différentes : lorsque vous devez travailler avec plusieurs bases de données
- Sessions isolées : lorsque vous avez besoin de sessions distinctes pour des tables temporaires ou des paramètres propres à la session
- Isolation par thread : lorsque les threads ont besoin de sessions indépendantes (comme indiqué ci-dessus)
Arguments courants des méthodes
Plusieurs méthodes du client utilisent l’un ou les deux arguments communsparameters et settings. Ces arguments nommés sont décrits ci-dessous.
Argument parameters
Les méthodes query* et command du ClickHouse Connect Client acceptent un argument nommé facultatif, parameters, utilisé pour associer des expressions Python à une expression de valeur ClickHouse. Deux types de liaison sont possibles.
Liaison côté serveur
ClickHouse prend en charge la liaison côté serveur pour les valeurs des requêtes. La valeur associée est envoyée séparément de la requête, sous forme de paramètre HTTP. ClickHouse Connect utilise ce mode lorsqu’il détecte une expression de la forme{<name>:<datatype>}. Transmettez les valeurs sous la forme d’un dictionnaire Python.
Les noms de paramètres doivent être des noms ASCII BareWord ClickHouse. Le driver accepte $ au début, au milieu ou à la fin du nom lorsque le serveur l’accepte, comme dans {$tenant_id:String}. Une clé de dictionnaire qui commence et se termine par $ et dont la valeur est un tampon tel que bytes, bytearray ou memoryview est réservée à la convention de paramètres binaires bruts de ClickHouse Connect. Si une telle clé est utilisée pour un paramètre côté serveur non binaire, limitez-vous à un seul espace réservé {name:Type}. Des noms $tag$ répétés peuvent être interprétés par ClickHouse comme des marqueurs heredoc.
Utilisez None de Python pour les valeurs Nullable. Les valeurs None imbriquées sont prises en charge dans les paramètres Array et Tuple, ainsi que dans les littéraux Map lorsque dict_parameter_format est défini sur "map".
- Liaison côté serveur avec dictionnaire Python, valeur DateTime et valeur de chaîne de caractères
SELECT et les instructions INSERT ... VALUES. Pour insérer de gros lots de données simples, privilégiez Client.insert.
Liaison côté client
ClickHouse Connect prend également en charge la liaison de paramètres côté client, ce qui offre davantage de souplesse pour générer des requêtes SQL basées sur des modèles. Pour la liaison côté client, l’argumentparameters doit être un dictionnaire ou une séquence. La liaison côté client utilise le formatage de chaînes Python de style “printf” pour la substitution des paramètres.
Notez que, contrairement à la liaison côté serveur, la liaison côté client ne fonctionne pas pour les identifiants de base de données tels que les noms de base de données, de table ou de colonne, car le formatage de style Python ne permet pas de distinguer les différents types de chaînes, qui doivent être mis en forme différemment (backticks ou guillemets doubles pour les identifiants de base de données, guillemets simples pour les valeurs de données).
- Exemple avec un dictionnaire Python, une valeur DateTime et l’échappement des chaînes
- Exemple avec une séquence Python (Tuple), Float64 et IPv4Address
La liaison de Pour la rétrocompatibilité, un nom de paramètre de dictionnaire se terminant par
datetime considère les valeurs naïves comme des heures d’horloge. Le client met en forme un datetime naïf tel quel. ClickHouse l’interprète en utilisant le fuseau horaire déclaré dans un espace réservé côté serveur tel que {dt:DateTime('Europe/Berlin')}, puis session_timezone lorsqu’il est défini, puis le fuseau horaire du serveur. Un datetime avec fuseau horaire est converti dans le fuseau horaire déclaré dans l’espace réservé lorsqu’il est présent, sinon dans le fuseau horaire du serveur indiqué au moment de la connexion. Si le paramètre session_timezone diffère de ce fuseau horaire du serveur indiqué, déclarez un fuseau horaire dans l’espace réservé afin de conserver l’instant souhaité pour les valeurs avec fuseau horaire.Pour une compatibilité temporaire avec l’ancienne conversion locale à l’hôte, définissez common.set_setting("naive_datetime_binding", "legacy") avant de lier les paramètres. Pour préserver un instant, attachez le tzinfo voulu à la valeur datetime avant de la transmettre en tant que paramètre. Les insertions dans des colonnes DateTime ou DateTime64 via client.insert interprètent par défaut les valeurs datetime naïves dans le fuseau horaire local du processus. Définissez le paramètre global naive_datetime_insert sur "server" pour les interpréter comme des heures locales dans le fuseau horaire de la colonne, ou dans le fuseau horaire du serveur lorsque la colonne n’en possède pas. Consultez Objets datetime sans fuseau horaire.Les insertions natives dans des colonnes Date et Date32 utilisent la date calendaire propre à la valeur Python datetime, sans conversion de fuseau horaire. Lorsque la même date calendaire est nécessaire à la fois pour une insertion et pour un paramètre de requête, transmettez explicitement value.date(). Consultez Valeurs Date et Date32.Pour un espace réservé {value:DateTime64(precision)} côté serveur, le type déclaré préserve automatiquement la précision à la sous-seconde, y compris dans les indications Array et Tuple.La liaison %s côté client n’a pas de type déclaré. Enveloppez un datetime dans DT64Param lorsqu’il doit être mis en forme avec une précision à la sous-seconde :_64 demande également un formatage DateTime64 lorsque ce nom suffixé exact n’est pas présent dans la requête.Un paramètre datetime.time ou datetime.timedelta est mis en forme comme un littéral [-]HH:MM:SS[.ffffff] pour les colonnes ClickHouse Time et Time64, dans les deux styles de liaison et dans les valeurs Array et Tuple. Le client ajoute les guillemets ; ne mettez donc pas l’espace réservé entre guillemets dans la requête. Un timedelta peut être négatif et dépasser 24 heures. Un Timedelta pandas conserve ses nanosecondes et met en forme une fraction de neuf chiffres pour Time64(9). Les informations de fuseau horaire d’un time avec fuseau horaire sont ignorées, car ClickHouse Time ne possède pas de fuseau horaire.Argument settings
Toutes les principales méthodes “insert” et “select” de ClickHouse Connect Client acceptent un argument de mot-clé settings facultatif pour transmettre les settings utilisateur du serveur ClickHouse pour l’instruction SQL concernée. L’argument settings doit être un dictionnaire. Chaque élément doit contenir un nom de setting ClickHouse et la valeur associée. Notez que les valeurs seront converties en chaînes de caractères lorsqu’elles seront envoyées au serveur comme paramètres de requête.
Comme pour les settings au niveau du client, ClickHouse Connect ignorera tous les settings que le serveur marque comme readonly=1, avec un message de log associé. Les settings qui s’appliquent uniquement aux requêtes via l’interface HTTP de ClickHouse sont toujours valides. Ces settings sont décrits dans l’API get_client.
Exemple d’utilisation des settings ClickHouse :
Méthode command du Client
Utilisez Client.command pour les instructions qui ne renvoient pas de jeu de données tabulaire, ou pour les requêtes qui renvoient une valeur primitive ou une ligne de valeurs. Selon la réponse, cette méthode peut renvoyer une chaîne, un entier, une séquence de chaînes ou QuerySummary. Une lecture qui produit un jeu de résultats vide renvoie une chaîne vide.
Exemples de commandes
Instructions DDL
Requêtes simples renvoyant une seule valeur
Commandes avec paramètres
Commandes avec settings
Méthode query du Client
Client.query récupère un jeu de données tabulaire au format Native de ClickHouse et renvoie un QueryResult. Le résultat complet est matérialisé dès qu’une propriété du résultat est consultée. Utilisez une méthode de streaming pour les résultats qui ne doivent pas être conservés en mémoire.
Lorsque le client détecte un
LIMIT 0 en fin de requête, il demande les métadonnées des colonnes au format JSON. Si la réponse contient des lignes, il lève clickhouse_connect.driver.exceptions.InternalError sans réexécuter la requête. Cela peut se produire avec des requêtes UNION, EXCEPT ou EXPLAIN se terminant par LIMIT 0.Pour ces requêtes, utilisez raw_query avec un format de sortie tel que fmt="JSON". Cette méthode renvoie des bytes que votre application devra décoder. Ce comportement s’applique aux clients HTTP synchrones, HTTP asynchrones et chDB.Exemples de requêtes
Requête de base
Accéder au résultat de la requête
Requête avec paramètres côté client
Requête avec paramètres côté serveur
Requête avec setting
L’objet QueryResult
La méthode query de base renvoie un objet QueryResult avec les propriétés publiques suivantes :
result_rows— Matrice de résultats orientée par lignes.result_columns— Matrice de résultats orientée par colonnes.result_set—result_rowsouresult_columns, selon l’orientation de la requête.column_names— Tuple contenant les noms des colonnes du résultat.column_types— Tuple d’objetsClickHouseType.row_count— Nombre de lignes de résultat matérialisées.query_id— ID de requête renvoyé ou généré pour la requête. Une chaîne vide signifie qu’aucun n’était disponible.summary— Dictionnaire décodé à partir de l’en-tête de réponseX-ClickHouse-Summary.first_item— Première ligne sous forme de dictionnaire, ouNonesi le résultat est vide.first_row— Première ligne sous forme de séquence, ouNonesi le résultat est vide.column_block_stream,row_block_streametrows_stream— Contextes de flux internes. Utilisez plutôt les méthodes de streaming correspondantes du client.
StreamContext prises en charge.
Consommer les résultats des requêtes avec NumPy, Pandas ou Arrow
ClickHouse Connect fournit des méthodes de requête spécialisées pour les formats de données NumPy, Pandas et Arrow. Pour plus d’informations sur l’utilisation de ces méthodes, notamment des exemples, la prise en charge du streaming et la gestion avancée des types, consultez Requêtes avancées (requêtes NumPy, Pandas et Arrow).Méthodes du Client pour les requêtes en streaming
Pour le streaming de grands ensembles de résultats, ClickHouse Connect propose plusieurs méthodes de streaming. Consultez Requêtes avancées (requêtes en streaming) pour plus de détails et d’exemples.Méthode insert du Client
Pour le cas d’usage courant consistant à insérer plusieurs enregistrements dans ClickHouse, il existe la méthode Client.insert. Elle accepte les paramètres suivants :
Cette méthode renvoie
QuerySummary. Son dictionnaire summary contient les valeurs renvoyées par le server. written_rows est une propriété pratique, tandis que written_bytes() et query_id() renvoient les valeurs correspondantes. En cas d’échec de l’insertion, une exception est levée.
Pour les méthodes d’insertion spécialisées qui fonctionnent avec les Pandas DataFrames, les tables PyArrow et les DataFrames basés sur Arrow, voir Insertion avancée (méthodes d’insertion spécialisées).
Un tableau NumPy est une Sequence of Sequences valide et peut être utilisé comme argument
data de la méthode principale insert ; une méthode spécialisée n’est donc pas nécessaire.Exemples
Les exemples ci-dessous partent du principe qu’une tableusers existe déjà, avec le schéma (id UInt32, name String, age UInt8).
Insertion simple par ligne
Insertion par colonnes
Insertion avec des types de colonnes explicitement spécifiés
Insérer dans une base de données spécifique
Insertions depuis des fichiers
Pour insérer des données directement depuis des fichiers dans des tables ClickHouse, consultez Insertion avancée (insertions depuis des fichiers).API brute
Pour les cas d’usage avancés nécessitant un accès direct à l’interface HTTP de ClickHouse, sans transformation de type, consultez Utilisation avancée (API brute).Python DB-API 2.0
Le moduleclickhouse_connect.dbapi implémente l’interface de connexion et de curseur définie par la PEP 249. Il déclare un niveau d’API de 2.0, threadsafety=2 et paramstyle="pyformat". Le module fournit également les constructeurs de types PEP 249 Date, Time, Timestamp et Binary, ainsi que les fonctions DateFromTicks, TimeFromTicks et TimestampFromTicks.
Le module exporte la hiérarchie d’exceptions de la PEP 249 : Warning, Error, InterfaceError, DatabaseError, DataError, OperationalError, IntegrityError, InternalError, ProgrammingError et NotSupportedError. Il s’agit des mêmes objets de classe que ceux exposés par clickhouse_connect.driver.exceptions : quel que soit le chemin d’importation utilisé, les erreurs du driver sont donc interceptées. L’exception StreamFailureError, propre au driver, reste disponible dans clickhouse_connect.driver.exceptions et hérite de OperationalError.
Cursor.execute et Cursor.executemany acceptent des arguments nommés supplémentaires settings et query_formats. settings transmet les paramètres de ClickHouse. query_formats applique des formats de lecture selon le type ClickHouse lorsqu’une instruction renvoie des lignes, en utilisant le même mapping que Client.query. Les deux méthodes acceptent également l’argument nommé uniquement pyformat_encoded. Sa valeur par défaut, True, respecte le contrat DB-API pyformat. Le dialecte SQLAlchemy le définit sur False lorsque le compilateur d’instructions a émis des signes de pourcentage bruts, les applications ne devraient donc normalement pas le définir. Les opérations Cursor.executemany paramétrées s’exécutent une fois par set de paramètres, en préservant la sémantique de liaison SQL et d’évaluation des expressions. Avec HTTP, une requête est donc envoyée par set de paramètres. Si un set de paramètres ultérieur échoue, les écritures précédentes restent validées. Pour ces insertions via executemany, Cursor.rowcount correspond à la somme des valeurs written_rows renvoyées par ClickHouse, ou à -1 lorsque cette valeur n’est pas disponible. Les instructions INSERT envoyées via Cursor.execute renvoient 0. La forme de compatibilité INSERT INTO table (columns) VALUES sans caractère de substitution utilise l’insertion Native. Une instruction INSERT sans caractère de substitution se terminant par VALUES lève ProgrammingError si elle n’est pas reconnue comme cette forme de compatibilité. Les applications qui ont besoin d’une insertion en bloc Native explicite doivent utiliser Client.insert. fetchone, fetchmany et fetchall consomment le jeu de résultats matérialisé courant.
Cursor.description déduit null_ok du type de chaque colonne de résultat. Les types non nullables renvoient False, et les types nullables renvoient True, y compris les wrappers Nullable, Variant et Dynamic. None signifie que la nullabilité est inconnue. Lorsqu’une requête commençant par SELECT ou WITH, en ignorant les commentaires initiaux, ne renvoie ni lignes ni métadonnées de colonnes, le curseur exécute une requête de métadonnées avec LIMIT 0 pour renseigner description. Si cette requête de métadonnées échoue, description reste vide.
ClickHouse ne fournit pas de transactions traditionnelles via cette interface HTTP. Connection.commit() et Connection.rollback() sont des opérations sans effet. Les règles de concurrence liées aux ID de session s’appliquent toujours lorsqu’une connexion est partagée.
Classes et fonctions utilitaires
Les modules suivants fournissent des utilitaires publics supplémentaires pour les applications clientes. La version du paquet installé est exposée sous forme de chaîne dansclickhouse_connect.__version__.
Exceptions
Les exceptions personnalisées, y compris la hiérarchie d’exceptions DB-API 2.0 réexportée parclickhouse_connect.dbapi, sont définies dans clickhouse_connect.driver.exceptions. DatabaseError et OperationalError exposent un attribut numérique code contenant le code d’erreur ClickHouse, ainsi qu’un attribut name contenant le nom symbolique tel que UNKNOWN_TABLE, afin que les applications puissent s’appuyer sur exc.code au lieu d’analyser le message. code est défini même lorsque show_clickhouse_errors est désactivé, tandis que name exige les détails de l’erreur (True ou "scrub"). Tous deux valent None lorsqu’ils ne sont pas disponibles, par exemple en cas d’erreurs de transport. Utilisez show_clickhouse_errors="scrub" lorsque les utilisateurs finaux doivent voir les erreurs SQL sans informations sur l’hôte ou la version du server. Ce paramètre contrôle également les messages StreamFailureError en cours de transmission et les messages de transport génériques. Il régit uniquement str(exc). Les erreurs de transport restent attachées en tant que __cause__, et les traces de pile peuvent contenir le texte d’erreur d’origine de l’hôte, de l’URL ou de la bibliothèque.
Utilitaires SQL ClickHouse
Les fonctions et la classe DT64Param du moduleclickhouse_connect.driver.binding peuvent être utilisées pour construire correctement les requêtes ClickHouse SQL et en échapper correctement le contenu. De même, les fonctions du module clickhouse_connect.driver.parser peuvent être utilisées pour analyser les noms de types de données ClickHouse.