使用psql的\ copy进行多行查询

Mik*_*e T 27 postgresql client-side export-to-csv psql

这是从" 将PostgreSQL的PL/pgSQL输出保存到CSV文件 "的答案中的后续问题.

我需要使用psql的\copy命令编写客户端CSV文件.一个班轮工作:

db=> \copy (select 1 AS foo) to 'bar.csv' csv header
COPY 1
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

是否可以使用\copy跨越多行的查询?我在Windows上使用psql.

Mik*_*e T 42

我现在的工作解决方案是创建一个临时视图,可以通过多行声明,然后在\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
Run Code Online (Sandbox Code Playgroud)

  • 如果您对数据库只有只读权限怎么办? (4认同)
  • @nyxz 是正确的,您不需要删除此视图。仅当您有多个查询要使用 `v1` 处理时,才可能有必要。 (2认同)

Sai*_*aim 5

我们可以使用HEREDOC多行 SQL 来提供psql并使用

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

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


hak*_*aki 5

您可以将服务器端 COPY 命令与 \g psql 命令结合起来,生成对本地文件的多行查询:

db=# COPY (
    SELECT department, count(*) AS employees
    FROM emp
    WHERE role = 'dba'
    GROUP BY department
    ORDER BY employees
) TO STDOUT WITH CSV HEADER \g department_dbas.csv
COPY 5
Run Code Online (Sandbox Code Playgroud)

我在这里详细描述了这种技术https://hakibenita.com/postgresql-unknown-features#use-copy-with-multi-line-sql