Postgresql入门之psql用法详解(四)- 高级功能

简介: psql 是 PostgreSQL 的交互式命令行工具,支持模式匹配、变量替换、SQL 插值、自定义提示符及行编辑功能。通过 `\d` 等元命令可按名称模式查看对象,支持通配符与正则表达式。变量可动态设置并安全插值到 SQL 中,提升脚本灵活性。提供丰富的环境变量与配置文件(如 `.psqlrc`)来自定义行为,兼容不同终端与编码环境,适用于本地或远程数据库管理。

模式

各种 \d 命令接受一个 pattern 参数来指定要显示的对象名称。在最简单的情况下,模式就是对象的准确名称。模式中的字符通常会像 SQL 名称中那样被转换为小写;例如,\dt FOO 将显示名为 foo 的表。与 SQL 名称一样,在模式周围加上双引号会阻止转换为小写。如果您需要在模式中包含实际的双引号字符,请在其双引号序列内写一对双引号;这同样符合 SQL 引用标识符的规则。例如,\dt "FOO""BAR" 将显示名为 FOO"BAR 的表(而不是 foo"bar)。与 SQL 名称的通常规则不同,您可以将双引号放在模式的一部分周围,例如 \dt FOO"FOO"BAR 将显示名为 fooFOObar 的表。

每当完全省略 pattern 参数时,\d 命令会显示当前模式搜索路径中所有可见的对象——这等同于使用 * 作为模式。(如果一个对象所在的模式在搜索路径中,并且搜索路径中较早没有出现同类同名的对象,则该对象被称为可见的。这等同于可以按名称引用该对象而无需显式模式限定的语句。)要查看数据库中的所有对象(无论是否可见),请使用 *.* 作为模式。

在模式中,* 匹配任何字符序列(包括空序列),? 匹配任何单个字符。(此表示法与 Unix shell 文件名模式类似。)例如,\dt int* 显示名称以 int 开头的表。但是在双引号内,*? 失去这些特殊含义,仅按字面匹配。

包含点 (.) 的关系模式被解释为模式名称模式后跟对象名称模式。例如,\dt foo*.*bar* 显示所有表名称包含 bar 且位于模式名称以 foo 开头的模式中的表。当没有出现点时,该模式仅匹配当前模式搜索路径中可见的对象。同样,双引号内的点失去其特殊含义并按字面匹配。包含两个点 (.) 的关系模式被解释为数据库名称后跟模式名称模式,再后跟对象名称模式。数据库名称部分不会被当作模式处理,并且必须与当前连接的数据库名称匹配,否则会引发错误。

包含点 (.) 的模式模式被解释为数据库名称后跟模式名称模式。例如,\dn mydb.*foo* 显示所有模式名称包含 foo 的模式。数据库名称部分不会被当作模式处理,并且必须与当前连接的数据库名称匹配,否则会引发错误。

高级用户可以使用正则表达式表示法,例如字符类,比如 [0-9] 来匹配任何数字。除了 . 被视作如上所述的分隔符,* 被转换为正则表达式表示法 .*? 被转换为 .,以及 $ 被按字面匹配。您可以在需要时通过写 ? 表示 .(R+|) 表示 R*,或 (R|) 表示 R? 来模拟这些模式字符。不需要将 $ 作为正则表达式字符,因为模式必须匹配整个名称,这与正则表达式的通常解释不同(换句话说,$ 会自动附加到您的模式)。如果您不希望模式被锚定,请在开头和/或结尾写 *。请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义并按字面匹配。此外,正则表达式特殊字符在运算符名称模式中(即 \do 的参数)按字面匹配。

高级功能

变量

psql 提供了类似于常见 Unix 命令 shell 的变量替换功能。变量是简单的名称/值对,其中值可以是任意长度的任何字符串。名称必须由字母(包括非拉丁字母)、数字和下划线组成。

要设置变量,请使用 psql 元命令 \set。例如,

testdb=> \set foo bar

将变量 foo 设置为值 bar。要检索变量的内容,请在名称前加上冒号,例如:

testdb=> \echo :foo
bar

这在常规 SQL 命令和元命令中都有效;下面在 SQL 插值 部分有更多详细信息。

如果您调用 \set 时不带第二个参数,则变量被设置为空字符串值。要取消设置(即删除)变量,请使用命令 \unset。要显示所有变量的值,调用不带任何参数的 \set

注意
\set 的参数遵循与其他命令相同的替换规则。因此,您可以构造有趣的引用,例如 \set :foo 'something' 并获得 Perl 或 PHP 中著名的"软链接"或"变量变量"。不幸的是(或幸运的是?),无法用这些构造做任何有用的事情。另一方面,\set bar :foo 是复制变量的完全有效的方法。

许多这些变量被 psql 特殊对待。它们表示某些可以在运行时通过更改变量的值来更改的选项设置,或者在某些情况下表示 psql 的可变状态。按照惯例,所有被特殊对待的变量名称都由全部大写的 ASCII 字母(以及可能的数字和下划线)组成。为了确保未来的最大兼容性,请避免将此类变量名称用于您自己的目的。

控制 psql 行为的变量通常不能被取消设置或设置为无效值。允许 \unset 命令,但被解释为将变量设置为其默认值。不带第二个参数的 \set 命令被解释为对于接受该值的控制变量将其设置为 on,对于其他变量则被拒绝。此外,接受值 onoff 的控制变量也会接受布尔值的其他常见拼写,例如 truefalse

被特殊对待的变量有:

AUTOCOMMIT
当为 on(默认值)时,每个 SQL 命令在成功完成后会自动提交。要在此模式下推迟提交,您必须输入 BEGINSTART TRANSACTION SQL 命令。当为 off 或未设置时,SQL 命令不会提交,直到您显式发出 COMMITEND。自动提交关闭模式通过在任何尚未在事务块中且本身不是 BEGIN 或其他事务控制命令,也不是不能在事务块内执行的命令(如 VACUUM)之前为您发出隐式 BEGIN 来工作。

注意
在自动提交关闭模式下,您必须通过输入 ABORTROLLBACK 来显式放弃任何失败的事务。还要记住,如果您在未提交的情况下退出会话,您的工作将会丢失。

注意
自动提交开启模式是 PostgreSQL 的传统行为,但自动提交关闭模式更接近 SQL 规范。如果您更喜欢自动提交关闭,可能希望在全系统的 psqlrc 文件或您的 ~/.psqlrc 文件中设置它。

COMP_KEYWORD_CASE
确定完成 SQL 关键字时使用哪种字母大小写。如果设置为 lowerupper,则完成的单词将分别为小写或大写。如果设置为 preserve-lowerpreserve-upper(默认值),则完成的单词将使用已输入单词的大小写,但没有任何输入即被完成的单词将分别为小写或大写。

DBNAME
您当前连接的数据库的名称。这在每次连接到数据库时(包括程序启动时)设置,但可以更改或取消设置。

ECHO
如果设置为 all,则所有非空输入行在读取时都会打印到标准输出。(这不适用于交互式读取的行。)要在程序启动时选择此行为,请使用开关 -a。如果设置为 queries,psql 会在每个查询发送到服务器时将其打印到标准输出。选择此行为的开关是 -e。如果设置为 errors,则只有失败的查询会显示在标准错误输出上。此行为的开关是 -b。如果设置为 none(默认值),则不显示任何查询。

ECHO_HIDDEN
当此变量设置为 on 且反斜杠命令查询数据库时,会首先显示查询。此功能可帮助您研究 PostgreSQL 内部结构并在您自己的程序中提供类似功能。(要在程序启动时选择此行为,请使用开关 -E。)如果您将此变量设置为值 noexec,则只显示查询,但实际上不发送到服务器执行。默认值为 off

ENCODING
当前的客户端字符集编码。这在每次连接到数据库时(包括程序启动时)以及当您使用 \encoding 更改编码时设置,但可以更改或取消设置。

ERROR
如果上一个 SQL 查询失败则为 true,成功则为 false。另请参阅 SQLSTATE

FETCH_COUNT
如果此变量设置为大于零的整数值,则 SELECT 查询的结果会分批获取和显示,每批的行数为此值,而不是在显示之前收集整个结果集的默认行为。因此,无论结果集的大小如何,都只使用有限的内存量。启用此功能时,通常使用 100 到 1000 的设置。

提示
虽然您可以将任何输出格式与此功能一起使用,但默认的对齐格式往往看起来不好,因为每批 FETCH_COUNT 行将单独格式化,导致行组之间的列宽不同。其他输出格式效果更好。

HIDE_TABLEAM
如果此变量设置为 true,则不显示表的访问方法详细信息。这主要用于回归测试。

HIDE_TOAST_COMPRESSION
如果此变量设置为 true,则不显示列压缩方法详细信息。这主要用于回归测试。

HISTCONTROL
如果此变量设置为 ignorespace,则以空格开头的行不会输入到历史记录列表中。如果设置为 ignoredups,则与上一条历史记录行匹配的行不会输入。值 ignoreboth 结合了这两个选项。如果设置为 none(默认值),则在交互模式下读取的所有行都会保存在历史记录列表中。

注意
此功能无耻地剽窃自 Bash。

HISTFILE
用于存储历史记录列表的文件名。如果未设置,文件名取自 PSQL_HISTORY 环境变量。如果该环境变量也未设置,则默认为 ~/.psql_history,在 Windows 上为 %APPDATA%\postgresql\psql_history。例如,将:

\set HISTFILE ~/.psql_history-:DBNAME

放在 ~/.psqlrc 中会导致 psql 为每个数据库维护一个单独的历史记录。

注意
此功能无耻地剽窃自 Bash。

HISTSIZE
要存储在命令历史记录中的最大命令数(默认为 500)。如果设置为负值,则不应用限制。

注意
此功能无耻地剽窃自 Bash。

HOST
您当前连接的数据库服务器主机。这在每次连接到数据库时(包括程序启动时)设置,但可以更改或取消设置。

IGNOREEOF
如果设置为 1 或更小,则向 psql 的交互式会话发送 EOF 字符(通常为 Control+D)将终止应用程序。如果设置为较大的数值,则必须键入该数量的连续 EOF 字符才能使交互式会话终止。如果变量设置为非数字值,则将其解释为 10。默认值为 0

注意
此功能无耻地剽窃自 Bash。

LASTOID
最后一个受影响的 OID 的值,由 INSERT\lo_import 命令返回。此变量仅保证在显示下一个 SQL 命令的结果之前有效。自版本 12 起的 PostgreSQL 服务器不再支持 OID 系统列,因此当目标为此类服务器时,INSERTLASTOID 将始终为 0。

LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE
当前 psql 会话中最近失败的查询的主要错误消息和相关的 SQLSTATE 代码,或者如果当前会话中未发生错误,则为空字符串和 00000

ON_ERROR_ROLLBACK
当设置为 on 时,如果事务块中的语句产生错误,则忽略该错误并继续事务。当设置为 interactive 时,此类错误仅在交互式会话中被忽略,而在读取脚本文件时不会被忽略。当设置为 off(默认值)时,事务块中产生错误的语句将中止整个事务。错误回滚模式通过在每个位于事务块中的命令之前为您发出隐式 SAVEPOINT,然后在命令失败时回滚到该保存点来工作。

ON_ERROR_STOP
默认情况下,命令处理在错误后继续。当此变量设置为 on 时,处理将立即停止。在交互模式下,psql 将返回到命令提示符;否则,psql 将退出,返回错误代码 3 以将此情况与致命错误条件(使用错误代码 1 报告)区分开。在任何一种情况下,任何当前正在运行的脚本(顶级脚本,如果有,以及它可能已调用的任何其他脚本)将立即终止。如果顶级命令字符串包含多个 SQL 命令,处理将在当前命令处停止。

PIPELINE_COMMAND_COUNT
正在进行的管道中排队的命令数。

PIPELINE_RESULT_COUNT
正在进行的管道中后跟 \flushrequest\syncpipeline 的命令数,这会强制服务器发送结果。这些结果可以使用 \getresults 检索。

PIPELINE_SYNC_COUNT
正在进行的管道中排队的同步消息数。

PORT
您当前连接的数据库服务器端口。这在每次连接到数据库时(包括程序启动时)设置,但可以更改或取消设置。

PROMPT1
PROMPT2
PROMPT3
这些指定 psql 发出的提示符的外观。请参阅下面的 提示符

QUIET
将此变量设置为 on 等效于命令行选项 -q。在交互模式下可能不太有用。

ROW_COUNT
上一个 SQL 查询返回或影响的行数,如果查询失败或未报告行数,则为 0

SERVER_VERSION_NAME
SERVER_VERSION_NUM
服务器的版本号,作为字符串(例如 9.6.210.111beta1)和数字形式(例如 90602100001)。这些在每次连接到数据库时(包括程序启动时)设置,但可以更改或取消设置。

SERVICE
服务名称(如果适用)。

SHELL_ERROR
如果上一个 shell 命令失败则为 true,成功则为 false。这适用于通过 \!\g\o\w\copy 元命令调用的 shell 命令,以及反引号 (` ) 扩展。请注意,对于 \o,此变量在输出管道被下一个 \o 命令关闭时更新。另请参阅 SHELL_EXIT_CODE

SHELL_EXIT_CODE
上一个 shell 命令返回的退出状态。0–127 表示程序退出代码,128–255 表示被信号终止,-1 表示无法启动程序或无法收集其退出状态。这适用于通过 \!\g\o\w\copy 元命令调用的 shell 命令,以及反引号 (` ) 扩展。请注意,对于 \o,此变量在输出管道被下一个 \o 命令关闭时更新。另请参阅 SHELL_ERROR

SHOW_ALL_RESULTS
当此变量设置为 off 时,只显示组合查询 (\;) 的最后一个结果,而不是所有结果。默认值为 onoff 行为是为了与旧版本的 psql 兼容。

SHOW_CONTEXT
此变量可以设置为值 nevererrorsalways 以控制是否在来自服务器的消息中显示 CONTEXT 字段。默认值是 errors(意味着将在错误消息中显示上下文,但不在通知或警告消息中显示)。当 VERBOSITY 设置为 tersesqlstate 时,此设置无效。(另请参阅 \errverbose,当您想要刚收到的错误的详细版本时使用。)

SINGLELINE
将此变量设置为 on 等效于命令行选项 -S

SINGLESTEP
将此变量设置为 on 等效于命令行选项 -s

SQLSTATE
与上一个 SQL 查询失败相关的错误代码,如果成功则为 00000

USER
您当前连接到的数据库用户。这在每次连接到数据库时(包括程序启动时)设置,但可以更改或取消设置。

VERBOSITY
此变量可以设置为值 defaultverbosetersesqlstate 以控制错误报告的详细程度。(另请参阅 \errverbose,当您想要刚收到的错误的详细版本时使用。)

VERSION
VERSION_NAME
VERSION_NUM
这些变量在程序启动时设置以反映 psql 的版本,分别作为详细字符串、短字符串(例如 9.6.210.111beta1)和数字(例如 90602100001)。它们可以更改或取消设置。

WATCH_INTERVAL
此变量设置 \watch 在执行查询之间等待的默认间隔(以秒为单位)。默认值为 2 秒。在命令中指定间隔会覆盖此变量。

SQL 插值

psql 变量的一个关键特性是您可以将它们"插值"(替换)到常规 SQL 语句以及元命令的参数中。此外,psql 提供了确保用作 SQL 文字和标识符的变量值被正确引用的功能。插值一个值而不进行任何引用的语法是在变量名前加上冒号 (:)。例如,

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;

将查询表 my_table。请注意,这可能不安全:变量的值被字面复制,因此它可以包含不匹配的引号,甚至反斜杠命令。您必须确保它放在那里是有意义的。

当值要用作 SQL 文字或标识符时,最安全的方法是安排对其进行引用。要将变量的值引用为 SQL 文字,请写一个冒号后跟单引号中的变量名。要将值引用为 SQL 标识符,请写一个冒号后跟双引号中的变量名。这些结构正确处理了变量值中嵌入的引号和其他特殊字符。前面的例子可以更安全地写成这样:

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";

变量插值不会在带引号的 SQL 文字和标识符内执行。因此,像 ':foo' 这样的结构无法从变量的值产生带引号的文字(即使它能工作也不安全,因为它无法正确处理值中嵌入的引号)。

使用此机制的一个示例是将文件的内容复制到表列中。首先将文件加载到变量中,然后将变量的值作为带引号的字符串进行插值:

testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');

(请注意,如果 my_file.txt 包含 NUL 字节,这仍然无效。psql 不支持变量值中嵌入 NUL 字节。)

由于冒号可以合法地出现在 SQL 命令中,因此除非命名变量当前已设置,否则不会替换明显的插值尝试(即 :name:'name':"name")。在任何情况下,您都可以用反斜杠转义冒号以保护其不被替换。

:{?name} 特殊语法根据变量是否存在返回 TRUEFALSE,因此总是被替换,除非冒号被反斜杠转义。

变量的冒号语法是嵌入式查询语言(如 ECPG)的标准 SQL。数组切片和类型转换的冒号语法是 PostgreSQL 扩展,有时会与标准用法冲突。用于将变量值转义为 SQL 文字或标识符的冒号引号语法是 psql 扩展。

提示符

psql 发出的提示符可以根据您的喜好进行自定义。三个变量 PROMPT1PROMPT2PROMPT3 包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 请求新命令时发出的正常提示符。提示符 2 在命令输入期间需要更多输入时发出,例如因为命令未以分号结束或引号未关闭。提示符 3 在您运行 SQL COPY FROM STDIN 命令并且需要在终端上键入行值时发出。

所选提示符变量的值按字面打印,除非遇到百分号 (%)。根据下一个字符,某些其他文本将被替换。定义的替换有:

%M
数据库服务器的完整主机名(带域名),如果连接是通过 Unix 域套接字则为 [local],如果 Unix 域套接字不在编译时的默认位置,则为 [local:/dir/name]

%m
数据库服务器的主机名,在第一个点处截断,如果连接是通过 Unix 域套接字则为 [local]

%>
数据库服务器正在监听的端口号。

%n
数据库会话用户名。(此值的扩展可能在数据库会话期间因 SET SESSION AUTHORIZATION 命令的结果而更改。)

%s
服务名称。

%/
当前数据库的名称。

%~
类似于 %/,但如果数据库是您的默认数据库,则输出为 ~(波浪号)。

%#
如果会话用户是数据库超级用户,则为 #,否则为 >。(此值的扩展可能在数据库会话期间因 SET SESSION AUTHORIZATION 命令的结果而更改。)

%p
当前连接的后端的进程 ID。

%P
管道状态:不在管道中时为 off,在正在进行的管道中时为 on,在已中止的管道中时为 abort

%R
在提示符 1 中通常为 =,但如果会话处于条件块的非活动分支中则为 @,或者在单行模式下为 ^,或者如果会话与数据库断开连接(如果 \connect 失败可能发生)则为 !。在提示符 2 中,%R 被替换为一个取决于 psql 期望更多输入的原因的字符:如果命令尚未终止则为 -,如果有未完成的 /* ... */ 注释则为 *,如果有未完成的带引号字符串则为单引号,如果有未完成的带引号标识符则为双引号,如果有未完成的美元引号字符串则为美元符号,或者如果有不匹配的左括号则为 (。在提示符 3 中,%R 不产生任何内容。

%x
事务状态:不在事务块中时为空字符串,在事务块中时为 *,在失败的事务块中时为 !,或者当事务状态不确定时(例如,因为没有连接)为 ?

%l
当前语句内部的行号,从 1 开始。

%digits
替换为具有指定八进制代码的字符。

%:name:
psql 变量 name 的值。有关详细信息,请参阅上面的 变量

%command
command 的输出,类似于普通的"反引号"替换。

%[ ... %]
提示符可以包含终端控制字符,例如,更改提示符文本的颜色、背景或样式,或更改终端窗口的标题。为了使 Readline 的行编辑功能正常工作,这些非打印控制字符必须通过用 %[%] 包围它们来指定为不可见。提示符中可出现多对此类字符对。例如:

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '

在兼容 VT100 且支持颜色的终端上会产生粗体 (1;) 黄底黑字 (33;40) 的提示符。

%w
与最近一次 PROMPT1 输出宽度相同的空白。这可以用作 PROMPT2 设置,以便多行语句与第一行对齐,但没有可见的辅助提示符。

要在提示符中插入百分号,请写 %%。默认提示符对于提示符 1 和 2 是 '%/%R%x%# ',对于提示符 3 是 '>> '

注意
此功能无耻地剽窃自 tcsh。

命令行编辑

如果可用,psql 使用 Readline 或 libedit 库进行方便的行编辑和检索。命令历史记录在 psql 退出时自动保存,并在 psql 启动时重新加载。键入向上箭头或 Control-P 可以检索之前的行。

您还可以使用制表符补全在许多(但绝非所有)上下文中填充部分键入的关键字和 SQL 对象名称。例如,在命令开头,键入 ins 并按 TAB 将填充 insert into。然后,键入表名或模式名的前几个字符并按 TAB 将填充未完成的名称,或者当有多个可能补全时提供一个菜单。(根据使用的库,您可能需要按 TAB 多次才能获得菜单。)

SQL 对象名称的制表符补全需要向服务器发送查询以查找可能的匹配项。在某些上下文中,这可能会干扰其他操作。例如,在 BEGIN 之后,如果在中间发出制表符补全查询,则发出 SET TRANSACTION ISOLATION LEVEL 为时已晚。如果您根本不想要制表符补全,可以通过在主目录中名为 .inputrc 的文件中放入以下内容来永久关闭它:

$if psql
set disable-completion on
$endif

(这不是 psql 的功能,而是 Readline 的功能。请阅读其文档以获取更多详细信息。)

-n (--no-readline) 命令行选项也可用于在单次运行 psql 时禁用 Readline。这会禁用制表符补全、使用或记录命令行历史记录以及编辑多行命令。当您需要复制和粘贴包含 TAB 字符的文本时,这尤其有用。

环境

COLUMNS
如果 \pset columns 为零,则控制环绕格式的宽度以及用于确定宽输出是否需要寻呼机或应切换到扩展自动模式中的垂直格式的宽度。

PGDATABASE
PGHOST
PGPORT
PGUSER

PG_COLOR
指定是否在诊断消息中使用颜色。可能值为 alwaysautonever

PSQL_EDITOR
EDITOR
VISUAL
\e\ef\ev 命令使用的编辑器。这些变量按列出顺序检查;使用第一个设置的变量。如果均未设置,默认在 Unix 系统上使用 vi,在 Windows 系统上使用 notepad.exe

PSQL_EDITOR_LINENUMBER_ARG
\e\ef\ev 与行号参数一起使用时,此变量指定用于将起始行号传递给用户编辑器的命令行参数。对于诸如 Emacs 或 vi 的编辑器,这是一个加号。如果选项名称和行号之间需要有空格,请在变量值的末尾包含一个尾随空格。示例:

PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '

默认在 Unix 系统上是 +(对应于默认编辑器 vi,并且对许多其他常见编辑器有用);但在 Windows 系统上没有默认值。

PSQL_HISTORY
命令历史记录文件的备用位置。执行波浪号 (~) 扩展。

PSQL_PAGER
PAGER
如果查询结果不适合屏幕,它们将通过此命令进行管道传输。典型值为 moreless。可以通过将 PSQL_PAGERPAGER 设置为空字符串,或通过调整 \pset 命令的与寻呼机相关的选项来禁用寻呼机的使用。这些变量按列出顺序检查;使用第一个设置的变量。如果均未设置,默认在大多数平台上使用 more,但在 Cygwin 上使用 less

PSQL_WATCH_PAGER
当使用 \watch 命令重复执行查询时,默认不使用寻呼机。可以通过将 PSQL_WATCH_PAGER 设置为寻呼机命令来更改此行为(在 Unix 系统上)。pspg 寻呼机(不是 PostgreSQL 的一部分,但在许多开源软件发行版中可用)如果以 --stream 选项启动,可以显示 \watch 的输出。

PSQLRC
用户的 .psqlrc 文件的备用位置。执行波浪号 (~) 扩展。

SHELL
\! 命令执行的命令。

TMPDIR
用于存储临时文件的目录。默认为 /tmp

此实用程序与大多数其他 PostgreSQL 实用程序一样,也使用 libpq 支持的环境变量。

文件

psqlrc 和 ~/.psqlrc
除非传递了 -X 选项,否则 psql 在连接到数据库之后、接受正常命令之前,会尝试从系统范围的启动文件 (psqlrc) 和用户的个人启动文件 (~/.psqlrc) 读取并执行命令。这些文件可用于根据需要设置客户端和/或服务器,通常使用 \setSET 命令。

系统范围的启动文件名为 psqlrc。默认情况下,在安装的"系统配置"目录中查找该文件,最可靠的方法是通过运行 pg_config --sysconfdir 来识别。通常,此目录是包含 PostgreSQL 可执行文件的目录的相对路径 ../etc/。要查找的目录可以通过 PGSYSCONFDIR 环境变量显式设置。

用户的个人启动文件名为 .psqlrc,并在调用用户的主目录中查找。在 Windows 上,个人启动文件名为 %APPDATA%\postgresql\psqlrc.conf。在任何一种情况下,都可以通过设置 PSQLRC 环境变量来覆盖此默认文件路径。

系统范围的启动文件和用户的个人启动文件都可以通过附加短划线和后跟 PostgreSQL 主版本或次版本标识符来使其特定于 psql 版本,例如 ~/.psqlrc-18~/.psqlrc-18.1。将优先读取最具体的版本匹配文件,而不是非版本特定的文件。这些版本后缀是在如上所述确定文件路径后添加的。

.psql_history
命令行历史记录存储在文件 ~/.psql_history 中,在 Windows 上存储在 %APPDATA%\postgresql\psql_history 中。

历史记录文件的位置可以通过 HISTFILE psql 变量或 PSQL_HISTORY 环境变量显式设置。

注意

psql 与相同或更旧主版本的服务器配合使用效果最佳。如果服务器比 psql 本身版本新,则反斜杠命令尤其可能失败。但是,\d 系列的反斜杠命令应该可以用于回溯到 9.2 版本的服务器,尽管不一定能用于比 psql 本身更新的服务器。运行 SQL 命令和显示查询结果的通用功能也应该适用于更新主版本的服务器,但这不能在所有情况下得到保证。

如果您想使用 psql 连接到多个不同主版本的服务器,建议您使用最新版本的 psql。或者,您可以保留每个主版本的 psql 副本,并确保使用与相应服务器匹配的版本。但在实践中,这种额外的复杂性应该不是必需的。

在 PostgreSQL 9.6 之前,-c 选项暗示 -X (--no-psqlrc);现在不再是这种情况。

在 PostgreSQL 8.4 之前,psql 允许单字母反斜杠命令的第一个参数直接跟在命令之后,中间没有空白。现在,需要一些空白。

Windows 用户注意事项

psql 被构建为"控制台应用程序"。由于 Windows 控制台窗口使用与系统其余部分不同的编码,因此在 psql 中使用 8 位字符时必须特别小心。如果 psql 检测到有问题的控制台代码页,它会在启动时发出警告。要更改控制台代码页,需要做两件事:

  1. 通过输入 cmd.exe /c chcp 1252 设置代码页。(1252 是适用于德语的代码页;请用您的值替换。)如果您使用 Cygwin,可以将此命令放在 /etc/profile 中。
  2. 将控制台字体设置为 Lucida Console,因为光栅字体不适用于 ANSI 代码页。

示例

第一个示例显示如何将命令分布在多行输入上。请注意提示符的变化:

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text)
testdb-> ;
CREATE TABLE

现在再次查看表定义:

testdb=> \d my_table
              Table "public.my_table"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 first  | integer |           | not null | 0
 second | text    |           |          |

现在我们将提示符更改为更有趣的内容:

testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>

假设您已用数据填充了表并想查看一下:

peter@localhost testdb=> SELECT * FROM my_table;
 first | second
-------+--------
     1 | one
     2 | two
     3 | three
     4 | four
(4 rows)

您可以使用 \pset 命令以不同的方式显示表格:

peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
    1 one
    2 two
    3 three
    4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format csv
Output format is csv.
peter@localhost testdb=> \pset tuples_only
Tuples only is on.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep '\t'
Field separator is "    ".
peter@localhost testdb=> SELECT second, first FROM my_table;
one     1
two     2
three   3
four    4

或者,使用短命令:

peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

此外,这些输出格式选项可以通过使用 \g 为单个查询设置:

peter@localhost testdb=> SELECT * FROM my_table
peter@localhost testdb-> \g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

这是一个使用 \df 命令查找名称匹配 int*pl 且第二个参数为 bigint 类型的函数的示例:

testdb=> \df int*pl * bigint
                          List of functions
   Schema   |  Name   | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
 pg_catalog | int28pl | bigint           | smallint, bigint    | func
 pg_catalog | int48pl | bigint           | integer, bigint     | func
 pg_catalog | int8pl  | bigint           | bigint, bigint      | func
(3 rows)

这里,使用 + 选项显示有关其中一个函数的附加信息,并使用 x 以扩展模式显示结果:

testdb=> \df+x int*pl integer bigint
List of functions
-[ RECORD 1 ]-------+-----------------------------
Schema              | pg_catalog
Name                | int48pl
Result data type    | bigint
Argument data types | integer, bigint
Type                | func
Volatility          | immutable
Parallel            | safe
Owner               | postgres
Security            | invoker
Leakproof?          | no
Access privileges   |
Language            | internal
Internal name       | int48pl
Description         | implementation of + operator

在适当的情况下,查询结果可以使用 \crosstabview 命令以交叉表表示形式显示:

testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;
 first | second | gt2
-------+--------+-----
     1 | one    | f
     2 | two    | f
     3 | three  | t
     4 | four   | t
(4 rows)

testdb=> \crosstabview first second
 first | one | two | three | four
-------+-----+-----+-------+------
     1 | f   |     |       |
     2 |     | f   |       |
     3 |     |     | t     |
     4 |     |     |       | t
(4 rows)

第二个示例显示了一个乘法表,其中行按相反的数字顺序排序,列具有独立的、递增的数字顺序。

testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
testdb-> row_number() over(order by t2.first) AS ord
testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb-> \crosstabview "A" "B" "AxB" ord
 A | 101 | 102 | 103 | 104
---+-----+-----+-----+-----
 4 | 404 | 408 | 412 | 416
 3 | 303 | 306 | 309 | 312
 2 | 202 | 204 | 206 | 208
 1 | 101 | 102 | 103 | 104
(4 rows)
相关文章
|
7天前
|
数据采集 人工智能 安全
|
17天前
|
云安全 监控 安全
|
3天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
285 164
|
2天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
291 155
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
219 113
|
10天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
763 5