使用psql' s \ copy进行多行查询

时间:2017-02-22 23:56:51

标签: postgresql client-side export-to-csv psql

这是this answer针对" Save PL/pgSQL output from PostgreSQL to a CSV file"的后续问题。

我需要使用psql' s \copy command编写客户端CSV文件。一个班轮工作:

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

但是,我有很长的查询,跨越几行。我不需要显示查询,因为我似乎无法在没有解析错误的情况下延伸过去一行:

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

是否可以将\copy与跨越多行的查询一起使用?我在Windows上使用psql。

2 个答案:

答案 0 :(得分:32)

我现在使用的工作解决方案是create a temporary view,可以通过多行声明,然后在\copy命令中从中选择,它可以轻松地放在一行上。

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

答案 1 :(得分:3)

我们可能使用HEREDOC将多行SQL馈送到psql并使用

# Putting the SQL using a HEREDOC
cat <<SQL | tr '\n' ' ' | \psql mydatabase
\COPY (
  SELECT
    provider_id,
    provider_name,
    ...
) TO './out.tsv' WITH( DELIMITER E'\t', NULL '', )
SQL

来源:https://minhajuddin.com/2017/05/18/how-to-pass-a-multi-line-copy-sql-to-psql/