如何为psql动态创建输出文件

时间:2019-07-18 17:05:05

标签: postgresql psql

我有一个SQL脚本,将用于在数据库中进行更改。出于审计和可追溯性的原因,我希望脚本根据DBNAME和时间戳生成输出文件名。

db_test=> select 'script_output-' || :'DBNAME' || '-' ||
 to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile;
                 spoolfile
--------------------------------------------
 script_output-db_test-20190718-163936.txt

但是,当我尝试将查询结果分配给\ out运算符时,我得到以下信息

db_test=> \out select 'script_output-' || :'DBNAME' || '-' || to_char(now(),'yyyymmdd-HH24MISS') || '.txt'
\out: extra argument "script_output-" ignored
\out: extra argument "||" ignored
\out: extra argument ":'DBNAME'" ignored
\out: extra argument "||" ignored
\out: extra argument "-" ignored
\out: extra argument "||" ignored
\out: extra argument "to_char(now(),yyyymmdd-HH24MISS)" ignored
\out: extra argument "||" ignored
\out: extra argument ".txt" ignored

实际创建的输出文件名为select

SDV184022L:~ myuser$ ls -la Downloads/DB-Install/sele*
-rw-r--r--  1 myuser  myuser     0B Jul 18 11:42 Downloads/DB-Install/select

基于这些结果和大量搜索,我将假设这是不可能的,那么有人可以通过另一种方法来生成针对输出指令的动态文件名吗?

2 个答案:

答案 0 :(得分:0)

您可以通过在其中运行psql命令来使用psql变量来存储查询结果。

knayak=# \set v_spoolfile `psql -A -t -c "select 'script_output-' ||  current_database() || '-' ||to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile" yourdbname`
knayak=# \echo :v_spoolfile
script_output-knayak-20190718-225537.txt
knayak=# \out :v_spoolfile

答案 1 :(得分:0)

由查询生成的结果可以使用\gset传递到psql中的自动实例化变量。变量的名称是列的名称。试试

db_test=> select 'script_output-' || :'DBNAME' || '-' ||
 to_char(now(),'yyyymmdd-HH24MISS') || '.txt' as spoolfile
 \gset

那你就可以做

db_test=> \out :spoolfile

请注意,该变量是通过“宏”扩展来处理的。因此,如果:spoolfile的值恰好包含空格或反斜杠,则psql会将其解释为好像是在命令行中输入的一样。