【问题标题】:How to use psql command line to remotely save multiple FOR loop results to remote client files?如何使用 psql 命令行将多个 FOR 循环结果远程保存到远程客户端文件?
【发布时间】:2017-03-12 03:29:54
【问题描述】:

我有一个匿名函数,其中包含执行 100 次的 FOR 循环中的查询,我需要将 100 个结果集保存为远程客户端上的 100 个文件(不是在服务器上)。

似乎 psql \copy 元命令应该是执行此操作的方法,但我不知所措。也许是这种形式的东西?

\copy (anonymous_function_w/_FOR_loop_here) to 'filename.txt'

其中 filename.txt 是根据每次迭代中 FOR 循环变量的值构建的。这很重要——远程客户端上的文件需要根据 FOR 循环的变量来命名。

有没有办法解决这个问题?我想另一种方法是将所有 100 个查询结果合并为一个大结果,将 FOR 循环的变量值放在一个字段中,然后使用 bash 脚本将其拆分为 100 个适当命名的文件。但是我的 bash 技能很蹩脚。如果 psql 可以直接完成这项工作,那就太好了。

编辑:我应该补充一点,这是 FOR 循环变量的样子:

FOR rec IN SELECT DISTINCT county FROM voter.counties

所以文件名将由 rec.county + '.txt' 构建

【问题讨论】:

    标签: postgresql psql


    【解决方案1】:

    解决此问题的典型方法是使用生成必要语句的 SQL 语句,将输出假脱机到脚本文件中,然后运行该文件。

    类似:

    -- prepare for a "plain" output without headers or something similar
    \a
    \t 
    
    -- spool the output into export.sql
    \o export.sql
    select format('\copy (select * from some_table where county = %L) to ''%s.txt''', county, county)
    from (select distinct county from voter.counties) t;
    
    -- turn spooling off
    \o 
    
    -- run the generated file
    \i export.sql
    

    因此对于voters.counties 中的每个县名,export.sql 将包含:

    \copy (select * from some_table where county = 'foobar') to 'foobar.txt'
    

    【讨论】:

    • 我想对您非常有帮助的回答表示感谢。因为我不是专业人士,所以我发现从与我的需求相关的示例开始学习最容易,然后回顾文档以确保我准确理解它在做什么。在这种特殊情况下,通过解决您的答案,我学到了很多关于 psql 的知识——这以前只是让我感到困惑——以及我不知道的 postgreSQL format 函数。现在我只需要弄清楚如何在我的 SQL 查询中转义 concat 函数中的所有撇号......但我会到达那里。
    • @CheesyGrits:不要使用concat() 使用format(),这会让整个“逃跑”变得容易很多
    • 如果我错了,请纠正我:在你的例子中,%s.txt 前面的单引号不应该在那里,对吧?即,该行应为 select format('\copy (select * from some_table where county = %L) to %s.txt', county, county) from (select distinct county from voter.counties) t; Yes?
    • @CheesyGrits:实际上应该是两个单引号才能将它们放入字符串中。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2019-11-14
    • 2020-02-25
    • 2012-05-28
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多