使用 psql,我可以从命令行覆盖 .psqlrc 中设置的变量吗?

using psql, can I override variables set in .psqlrc from command line?

我想要一个具有默认值的 .psqlrc 文件,并且能够从 psql 的命令行覆盖这些值。

例如:

-- .psqlrc :
-- "user@database # " in bold green
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
-- store command history in home directory, with a per database file :
\set HISTFILE ~/.psql-history- :DBNAME
# master-psql.sh :
# when using this script, change color to red, change history file location :
psql -U postgres \
  -v PROMPT1='%[%033[1;31;40m%]%n@%/%[%033[0m%]% # ' \
  -v HISTFILE='/some/other/place/.psql_history_postgres'

以上不起作用,因为 -v ... 参数在 之前执行 .psqlrc 文件被加载,并且 [=12] 中的指令=] 覆盖现有值。

问题

有没有办法指示 psql 运行 一组命令 加载其 .psqlrc 文件后,
或者让 .psqlrc 仅在未设置值时执行一些 \set\pset 命令?

如果已经设置到 .psqlrc 文件本身,您可以编写不覆盖这些变量的说明:

\if :{?HISTFILE}
\else
\set HISTFILE ~/.psql-history- :DBNAME
\endif

如果你不能让你的系统psqlrc配合你,那么可能需要复制修改然后绕过原来的。 :{? 构造至少需要 v11。

问题是即使没有 RC 文件处理,PROMPT1 也有一个内置的默认值,因此您可能需要针对内置的字符串测试它,而不是测试是否被定义。所以我认为最终会是这样的:

select :'PROMPT1'='%/%R%x%# ' as default_prompt \gset
\if :default_prompt
\set PROMPT1 '%[%033[1;32;40m%]%n@%/%[%033[0m%]% > '
\endif

请注意,默认编译在 v13 中发生了变化,因此如果您也想使用旧版本,则需要做一些更复杂的事情。

从这里开始:

https://www.postgresql.org/docs/current/app-psql.html

Environment
[...]

PSQLRC
Alternative location of the user's .psqlrc file. Tilde (~) expansion is performed.

因此,创建一个备用 .psqlrc 文件并为脚本设置 PSQLRC 环境变量以覆盖您的默认值。