Bus*_*cka 9 postgresql command-line dynamic-sql variable-substitution psql
是否可以在 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
Run Code Online (Sandbox Code Playgroud)
tbu*_*ann 11
(同时)记录了\copy元命令不扩展变量的例外情况
与大多数其他元命令不同,该行的整个剩余部分始终被视为 \copy 的参数,并且在参数中既不执行变量插值也不执行反引号扩展。
要解决此问题,您可以分多个步骤构建、存储和执行命令(类似于 Clodoaldo Neto 给出的解决方案):
\set filename 'my fancy dynamic name'
\set command '\\copy (SELECT * FROM generate_series(1, 5)) to ' :'filename'
:command
Run Code Online (Sandbox Code Playgroud)
这样,您需要在嵌入的元命令中加倍(转义)任何\and 。'请记住,\set它将所有其他参数连接到第二个参数,因此参数之间需要用引号引起来。:command您可以使用 来在执行 ( )之前显示命令\echo :command。
作为本地\set命令的替代方案,您还可以使用 SQL 构建命令服务器端(最佳方法取决于动态内容的来源):
SELECT '\copy (SELECT * FROM generate_series(1, 5)) to ''' || :'filename' || '''' AS command \gset
Run Code Online (Sandbox Code Playgroud)
动态构建\copy命令并将其存储在文件中。然后执行它\i
首先设置元组仅输出
\t
Run Code Online (Sandbox Code Playgroud)
将输出设置为文件
\o 'C:/users/user/desktop/copy_command.txt'
Run Code Online (Sandbox Code Playgroud)
构建\copy命令
select format(
$$\copy (select * from the_table) To 'C:/users/user/desktop/table_%s.csv' WITH DELIMITER AS ';' CSV HEADER$$
, current_date
);
Run Code Online (Sandbox Code Playgroud)
将输出恢复为stdout
\o
Run Code Online (Sandbox Code Playgroud)
执行文件中生成的命令
\i 'C:/users/user/desktop/copy_command.txt'
Run Code Online (Sandbox Code Playgroud)