5

可以在文件名末尾带有当前日期的 PSQL 控制台导出文件中吗?导出文件的名称应该像这样table_20140710.csv是否可以动态执行此操作?- 日期的格式可以与上面的不同,这并不重要。

这是我的意思的例子:

\set curdate current_date
\copy (SELECT * FROM table) To 'C:/users/user/desktop/table_ ' || :curdate  || '.csv' WITH DELIMITER AS ';' CSV HEADER
4

2 回答 2

4

动态构建\copy命令并将其存储在文件中。然后执行它\i

第一组元组只输出

\t

将输出设置为文件

\o 'C:/users/user/desktop/copy_command.txt'

构建\copy命令

select format(
    $$\copy (select * from the_table) To 'C:/users/user/desktop/table_%s.csv' WITH DELIMITER AS ';' CSV HEADER$$
    , current_date
);

将输出恢复为stdout

\o

从文件执行生成的命令

\i 'C:/users/user/desktop/copy_command.txt'
于 2014-07-10T12:59:23.130 回答
2

(同时)记录\copy了元命令不扩展变量的例外

与大多数其他元命令不同,该行的整个剩余部分总是作为 \copy 的参数,并且在参数中既不执行变量插值也不执行反引号扩展。

要解决此问题,您可以分多个步骤构建、存储和执行命令(类似于 Clodoaldo Neto 给出的解决方案):

\set filename 'my fancy dynamic name'
\set command '\\copy (SELECT * FROM generate_series(1, 5)) to ' :'filename'
:command

有了这个,您需要\在嵌入的元命令中加倍(转义)。请记住,它将\set所有进一步的参数连接到第二个参数,因此请在参数之间引用空格。您可以在执行前显示命令 ( :command) 使用\echo :command.

作为本地\set命令的替代方案,您还可以使用 SQL 构建命令服务器端(最佳方式取决于动态内容的来源):

SELECT '\copy (SELECT * FROM generate_series(1, 5)) to ''' || :'filename' || '''' AS command \gset
于 2021-05-21T18:19:30.097 回答