PSQL(postgres或redshift)存储的变量来提示查询并将查询写入动态文件名

时间:2019-02-21 19:08:55

标签: postgresql amazon-redshift psql

我的临时工作流程经常在psql客户端中访问我,因此我经常在.psqlrc文件中定义有用的查询或设置更改。我将分享此问题的解决方案,因为在线示例很少,并且由于您不能在元命令中使用换行符,因此语法变得难看,调试花费了很长时间。

在变量中定义psql元命令,该变量会提示sql文件路径并使用动态文件名写入本地文件

  • 提示执行sql文件
  • 提示输出文件名前缀
  • 根据ISO报告周生成动态输出文件名

这是我要包装到.pqslrc定义的变量中的步骤的手动示例:

-- the following at psql prompt =>>

select 'file_prefix' || '_week_'
  || to_char(next_day(current_date - 1 - 7 * 1, 'sat') + 1,'iyyy-iw') 
  || '.txt'  report_filename;
┌──────────────────────────────┐
│       report_filename        │
├──────────────────────────────┤
│ file_prefix_week_2019-07.txt │
└──────────────────────────────┘

\out file_prefix_week_2019-07.txt

\a \pset footer off   -- no border or row count to output file

\i 'path/to/sql_file.sql'
-- now I have a text file of the output locally on my machine

\out \a \pset footer on

=>>
-- back to normal terminal output

1 个答案:

答案 0 :(得分:0)

这是可以在psql命令行上发布或附加到.psqlrc上并从psql提示符下以变量名调用的工作解决方案:

-- newlines are included for readability but:
-- **remove all newlines when pasting to .psqlrc**

\set report '\\echo enter filename prefix:\\\\ \\prompt file_prefix \\\\
 \\echo enter sql file path:\\\\ \\prompt sql_file \\\\
 select :''file_prefix'' || ''_week_''
 || to_char(next_day(current_date - 1 - 7 * 1, ''sat'') + 1,''iyyy-iw'')
 || ''.txt''  report_filename \\gset \\\\
 \\pset footer off \\pset border 0 \\pset expanded off \\pset format unaligned \\\\
 \\out :report_filename \\\\
 \\i :sql_file \\\\ 
 \\out \\\\
 \\pset footer on  \\pset border 2 \\pset expanded auto
 \\pset format aligned \\pset linestyle unicode'

要点:

Postgres psql documentation current version

  • 复制/粘贴时删除所有换行符
  • 可变字符串不能有换行符,只能是一个长字符串
  • 字符串包含在单引号'
  • 符号\\分隔命令
    • 符号\通过加倍转义
    • 因此将\\用于\,将\\\\用于\\
  • 字符串中的
  • 单引号通过加倍转义
    • 因此在字符串中的''上使用'
    • 这也算是:variables也是字符串
  • \gset将查询的输出分配给列名称的变量
  • :sql_file可以包含空格,变量存储为文本字符串,\i可以解析而无需包装为:''sql_file''

.psqlrc中的相关组件

-- .psqlrc
-- remove newlines from \set variable strings before pasting

\pset fieldsep '\t'
\set prompt_1 '%R%#> '
\set PROMPT1 :prompt_1

\set prompt_copyout 'copyout : : : copyout\n%R%#> '

-- helper variables
-- usage:
-- :copyout desired_output_filename
\set copyout '\\pset footer off \\pset border 0 \\pset expanded off
 \\pset format unaligned \\pset title \\pset null '''' 
 \\set PROMPT1 :prompt_copyout \\out '

-- usage to return to normal terminal output
-- :copyoff
\set copyoff '\\pset footer on  \\pset border 2 \\pset expanded auto
 \\pset format aligned \\pset title \\pset null ''[null]'' 
 \\set PROMPT1 :prompt_1 \\pset linestyle unicode \\out \\\\'

用辅助变量重新构造

我在复制到本地文本文件和在终端屏幕上查看sql输出之间进行切换,因此我的实际用法包括以下助手:

-- again remove all newlines before pasting into .psqlrc
\set report '\\echo enter filename prefix:\\\\ \\prompt file_prefix \\\\
 \\echo enter sql file path:\\\\ \\prompt sql_file \\\\
 select :''file_prefix'' || ''_week_''
 || to_char(next_day(current_date - 1 - 7 * 1, ''sat'') + 1,''iyyy-iw'')
 || ''.txt''  report_filename \\gset \\\\
 :copyout :report_filename \\\\
 \\i :sql_file \\\\ 
 :copyoff'