Skip to main content
Le moteur permet d’importer et d’exporter des données vers SQLite et prend en charge les requêtes sur des tables SQLite directement depuis ClickHouse.

Créer une table

Paramètres du moteur
  • db_path — Chemin vers le fichier SQLite contenant une base de données.
  • table — Nom d’une table de la base de données SQLite, ou requête transmise telle quelle à SQLite (voir Passer une requête au lieu d’un nom de table).

Utilisation d’une requête à la place d’un nom de table

Au lieu d’un nom de table, l’argument table peut être une requête SELECT transmise telle quelle à SQLite. La structure de la table est déduite du résultat de la requête. SQLite ne signale un type déclaré que pour une colonne de résultat correspondant directement à une colonne d’une table ; pour une expression, un littéral ou un agrégat, il ne signale rien. Un type déclaré correspondant à String (voir la correspondance des types) est utilisé tel quel. Une colonne sans type déclaré est typée d’après la classe de stockage de sa valeur dans la première ligne du résultat de la requête : une valeur INTEGER donne Int64, une valeur REAL donne Float64, et toute autre valeur (TEXT, BLOB, NULL), de même qu’un résultat vide, donne String. Un type déclaré numérique est lui aussi vérifié par rapport à cette première ligne, car SQLite signale également un type déclaré pour un SELECT composé : ce type est tiré de l’une de ses branches, alors que les lignes proviennent de toutes. Il est conservé lorsque la classe de stockage de la valeur concorde avec lui (INTEGER pour un type entier, INTEGER ou REAL pour un type à virgule flottante), ainsi que lorsque la valeur est NULL ou que le résultat est vide, puisqu’aucun des deux ne porte d’information de type susceptible de le contredire ; dans le cas contraire, la colonne est typée d’après la classe de stockage, comme une colonne sans type déclaré. Le type déduit ne peut donc qu’être élargi, jamais ramené à un type plus restreint. La déduction d’une telle colonne déclenche l’exécution de la requête dans SQLite. La première ligne n’est pas représentative des suivantes : SQLite peut renvoyer une classe de stockage différente à chaque ligne (par exemple, CASE WHEN id = 1 THEN 1 ELSE 1.5 END). Une lecture basée sur une requête fonctionne donc en mode fail-closed pour toute colonne lue via un type numérique, et pas seulement pour celles sans type déclaré. Une valeur dont la classe de stockage ne correspond pas à ce type, ou qui n’y est pas exactement représentable (une cellule INTEGER valant 300 dans une colonne UInt8, une cellule REAL valant 16777217 dans une colonne Float32), fait échouer la lecture au lieu d’être convertie silencieusement. Pour lire une colonne contenant des valeurs de classes de stockage différentes, déclarez-la en String ou convertissez-la en texte dans la requête SQLite. Toutes les colonnes déduites sont Nullable. La requête peut être écrite soit sous forme de sous-requête, soit encapsulée dans la fonction query :
La transmission d’une requête est prise en charge à partir de la version 26.7. ClickHouse encapsule la requête dans SELECT ... FROM (<query>) avant de l’envoyer à SQLite ; elle ne doit donc pas se terminer par un point-virgule. Une telle table est en lecture seule : les INSERT n’y sont pas autorisés. La même syntaxe est prise en charge par la fonction de table sqlite.
La forme de sous-requête (SELECT ...) est analysée par ClickHouse puis re-sérialisée avant d’être envoyée à SQLite. Elle doit donc être valide en SQL ClickHouse. Pour transmettre une syntaxe spécifique à SQLite que ClickHouse n’analyse pas, utilisez la forme query('...'), dont le texte est envoyé tel quel à SQLite.Tout WHERE, LIMIT, toute agrégation, etc. externe de la requête ClickHouse englobante n’est pas répercuté dans la requête transmise : ils sont appliqués dans ClickHouse après récupération du résultat complet de la requête. Pour restreindre les données lues depuis SQLite, placez le filtre dans la requête transmise. Avec external_table_strict_query = 1, un filtre externe sur les colonnes de la table est rejeté avec une exception au lieu d’être appliqué localement, car il ne peut pas être répercuté dans la requête transmise. La vérification couvre le prédicat WHERE de niveau supérieur et chaque terme d’un AND de niveau supérieur. Un PREWHERE sur les colonnes de cette table n’est pas concerné par ce paramètre : ce moteur de table ne prend pas en charge PREWHERE, et une telle requête est rejetée avec ILLEGAL_PREWHERE, quel que soit le paramètre. La vérification ne s’exécute que lorsqu’un filtre pourrait effectivement être répercuté : lorsque cette table est la seule table de la requête, de part et d’autre d’un INNER JOIN, ou du côté préservé d’une jointure externe (le côté gauche d’un LEFT JOIN, le côté droit d’un RIGHT JOIN). Du côté non préservé d’un LEFT/RIGHT JOIN et de chaque côté d’un FULL JOIN, rien n’est répercuté ni vérifié ; un filtre sur les colonnes de cette table est donc appliqué localement après la jointure, même en mode strict. Lorsque la vérification s’exécute, un prédicat qui fait référence à d’autres tables jointes dans la requête englobante n’est pas répercuté et est exclu de la vérification, qu’il fasse uniquement référence au côté joint ou qu’il mélange ce côté avec cette table dans une expression unique autre que AND (par exemple un OR) ; un tel prédicat conserve son point d’évaluation ClickHouse habituel (WHERE après la jointure, PREWHERE avant celle-ci) et n’est pas rejeté.

Prise en charge des types de données

Lorsque vous spécifiez explicitement les types de colonnes ClickHouse dans la définition de la table, les types ClickHouse suivants peuvent être interprétés à partir de colonnes TEXT SQLite : Consultez le moteur de base de données SQLite pour la correspondance de types par défaut. La lecture d’un NULL SQLite dans une colonne ClickHouse explicitement déclarée non Nullable lève l’exception CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. Pour lire des valeurs NULL, déclarez la colonne comme Nullable. Lorsque le schéma est inféré, il suit les métadonnées SQLite : une colonne est Nullable, sauf si elle est déclarée NOT NULL.

Exemple d’utilisation

Affiche une requête qui crée la table SQLite :
Renvoie les données contenues dans la table :
Voir aussi