我的临时工作流程经常在psql
客户端中访问我,因此我经常在.psqlrc
文件中定义有用的查询或设置更改。我将分享此问题的解决方案,因为在线示例很少,并且由于您不能在元命令中使用换行符,因此语法变得难看,调试花费了很长时间。
psql
元命令,该变量会提示sql文件路径并使用动态文件名写入本地文件这是我要包装到.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
答案 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'