SELECT et INSERT sur des données stockées sur un serveur PostgreSQL distant.
Syntaxe
Arguments
Les arguments peuvent également être transmis à l’aide de collections nommées. Dans ce cas,
host et port doivent être indiqués séparément. Cette approche est recommandée en production.
Valeur renvoyée
Dans la requête
INSERT, pour distinguer la fonction de table postgresql(...) d’un nom de table accompagné d’une liste de noms de colonnes, vous devez utiliser les mots-clés FUNCTION ou TABLE FUNCTION. Voir les exemples ci-dessous.Paramètres
postgresql (ainsi que par le moteur de table PostgreSQL) peut être configuré à l’aide d’une clause SETTINGS en fin d’instruction. Lorsqu’un paramètre n’est pas spécifié, il prend par défaut la valeur du paramètre postgresql_* correspondant au niveau de la requête. Consultez la section Paramètres du moteur de table pour obtenir la liste complète des paramètres postgresql_connection_pool_* et postgresql_connection_attempt_timeout, ainsi que leurs valeurs par défaut.
Exemple :
Détails d’implémentation
SELECT côté PostgreSQL s’exécutent sous la forme de COPY (SELECT ...) TO STDOUT à l’intérieur d’une transaction PostgreSQL en lecture seule, avec un commit après chaque requête SELECT.
Les clauses WHERE simples, telles que =, !=, >, >=, <, <= et IN, sont exécutées sur le serveur PostgreSQL.
Toutes les jointures, agrégations, opérations de tri, conditions IN [ array ] et la contrainte d’échantillonnage LIMIT sont exécutées dans ClickHouse, uniquement une fois la requête PostgreSQL terminée.
Passer une requête au lieu d’un nom de table
SELECT transmise telle quelle à PostgreSQL. La structure de la table résultante est inférée à partir du résultat de la requête. La requête peut être écrite soit comme une sous-requête, soit encapsulée dans la fonction query :
INSERT n’y sont pas autorisées. La même syntaxe est prise en charge par le moteur de table PostgreSQL.
La forme de sous-requête
(SELECT ...) est analysée par ClickHouse puis re-sérialisée dans le dialecte PostgreSQL (quotage des identifiants PostgreSQL et échappement des littéraux de chaîne) avant d’être envoyée au serveur. Elle doit donc être valide en ClickHouse SQL. Pour transmettre une syntaxe spécifique à PostgreSQL que ClickHouse n’analyse pas, utilisez la forme query('...'), dont le texte est envoyé tel quel à PostgreSQL.Toute clause externe WHERE, LIMIT, agrégation, etc. de la requête ClickHouse englobante n’est pas déléguée à la requête transmise — elle est appliquée dans ClickHouse après récupération du résultat complet de la requête. Pour restreindre les données lues depuis PostgreSQL, placez le filtre dans la requête transmise. Avec external_table_strict_query = 1, un filtre externe qui ne peut pas être délégué est rejeté avec une exception au lieu d’être appliqué localement.INSERT côté PostgreSQL s’exécutent sous la forme de COPY "table_name" (field1, field2, ... fieldN) FROM STDIN à l’intérieur d’une transaction PostgreSQL avec commit automatique après chaque instruction INSERT.
Les types Array de PostgreSQL sont convertis en tableaux ClickHouse.
Attention : dans PostgreSQL, une colonne de type tableau comme Integer[] peut contenir des tableaux de dimensions différentes selon les lignes, mais dans ClickHouse, seuls des tableaux multidimensionnels de même dimension sont autorisés dans toutes les lignes.
|. Par exemple :
0.
Exemples
Répliquer ou migrer des données Postgres avec PeerDB
En plus des fonctions de table, vous pouvez également utiliser PeerDB de ClickHouse pour mettre en place un pipeline de données continu de Postgres vers ClickHouse. PeerDB est un outil spécialement conçu pour répliquer des données de Postgres vers ClickHouse à l’aide de la capture de données modifiées (CDC).