簡體   English   中英

如何為psql動態創建輸出文件

[英]how to dynamically create an output file for 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

根據這些結果和大量搜索,我將假設這是不可能的,那么有人能為輸出指令生成動態文件名嗎?

您可以通過在其中運行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

查詢生成的結果可以使用\\gset轉移到psql中的自動實例化變量。 變量的名稱是列的名稱。 嘗試

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

那你可以做

db_test=> \out :spoolfile

請注意,該變量是使用“宏”類擴展進行處理的。 因此,如果:spoolfile的值恰好包含空格或反斜杠,則psql會將其解釋為如同在命令行上輸入的一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM