web-dev-qa-db-fra.com

Utilisez \ copy de psql pour une requête sur plusieurs lignes

Il s'agit d'une question complémentaire de cette réponse pour " Enregistrer la sortie PL/pgSQL de PostgreSQL dans un fichier CSV ".

J'ai besoin d'écrire un fichier CSV côté client en utilisant psql \copy commande . Un liner fonctionne:

db=> \copy (select 1 AS foo) to 'bar.csv' csv header
COPY 1

Cependant, j'ai de longues requêtes qui s'étendent sur plusieurs lignes. Je n'ai pas besoin d'afficher la requête, car je n'arrive pas à étendre cette dernière ligne sans erreur d'analyse:

db=> \copy (
\copy: parse error at end of line
db=> \copy ( \\
\copy: parse error at end of line
db=> \copy ("
\copy: parse error at end of line
db=> \copy "(
\copy: parse error at end of line
db=> \copy \\
\copy: parse error at end of line

Est-il possible d'utiliser \copy avec une requête qui s'étend sur plusieurs lignes? J'utilise psql sur Windows.

27
Mike T

La solution de travail que j'ai en ce moment est de créer une vue temporaire , qui peut être déclarée sur plusieurs lignes, puis sélectionnez-la dans le \copy commande, qui tient confortablement sur une seule ligne.

db=> CREATE TEMP VIEW v1 AS
db->   SELECT i
db->   FROM generate_series(1, 2) AS i;
CREATE VIEW
db=> \cd /path/to/a/really/deep/directory/structure/on/client
db=> \copy (SELECT * FROM v1) TO 'out.csv' csv header
COPY 2
db=> DROP VIEW v1;
DROP VIEW
37
Mike T