【问题标题】:Use psql's \copy for a multi-line query使用 psql 的 \copy 进行多行查询
【发布时间】:2017-07-13 06:36:01
【问题描述】:

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

我需要使用 psql 的\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。

【问题讨论】:

  • 你可能不得不转义换行符?
  • @Falmarri 我在我的问题中提出了一些常见的转义尝试,但是从文档“psql 的 ... 反斜杠转义不适用”到 \copy,这让事情变得很困难。跨度>
  • 我已经给她发了一个答案:stackoverflow.com/a/44043716/24105,这是获取多行的迂回方式。

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


【解决方案1】:

我现在的工作解决方案是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

【讨论】:

  • 如果是临时视图,是否需要显式删除视图?
  • @nyxz 是正确的,您不需要删除此视图。仅当您有多个要使用v1 处理的查询时才需要。
  • 我找到的最简单的解决方案。谢谢!
  • 如果你只有数据库的只读权限呢?
【解决方案2】:

我们可以使用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/

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-08-29
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多