Postgresql入门之psql用法详解(二)- 元命令详解(\a-\dc)

简介: psql元命令以反斜杠开头,由psql客户端直接解析执行,用于增强数据库管理与脚本操作。支持参数引用、变量插值、shell命令执行及SQL语句联动,涵盖连接控制、对象查看、数据导入导出等功能,是PostgreSQL交互操作的重要工具。

元命令

您在 psql 中输入的任何以未加引号的反斜杠开头的内容都是一个 psql 元命令,由 psql 本身处理。这些命令使 psql 在管理或脚本编写方面更加有用。元命令通常称为斜杠或反斜杠命令。

psql 命令的格式是反斜杠,后紧跟一个命令动词,然后是任何参数。参数与命令动词之间以及参数彼此之间由任意数量的空白字符分隔。

要在参数中包含空白,可以用单引号将其引起来。要在参数中包含单引号,请在单引号文本内写入两个单引号。单引号中包含的任何内容还会进行类似 C 的替换,例如 \n(换行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(八进制)和 \xdigits(十六进制)。在单引号文本中,前面有反斜杠的任何其他字符都会引用该单个字符,无论它是什么。

如果参数中出现未加引号的冒号(:)后跟一个 psql 变量名,它将被变量的值替换,如下面的 SQL 插值所述。那里描述的 :'variable_name' 和 :"variable_name" 形式也有效。:{?variable_name} 语法允许测试变量是否已定义。它被替换为 TRUE 或 FALSE。用反斜杠转义冒号可以防止其被替换。

在参数中,用反引号(`)括起来的文本被视为传递给 shell 的命令行。命令的输出(删除任何尾随换行符)将替换反引号文本。在反引号括起来的文本中,不会发生特殊的引用或其他处理,除了 variable_name 是 psql 变量名的 :variable_name 出现的地方会被变量的值替换。此外,:'variable_name' 的出现会被替换为适当引用的变量值,以成为单个 shell 命令参数。(后一种形式几乎总是更可取的,除非您非常确定变量中的内容。)由于回车和换行符不能在所有平台上安全地引用,当值中出现此类字符时,:'variable_name' 形式会打印错误消息并且不替换变量值。

一些命令将 SQL 标识符(例如表名)作为参数。这些参数遵循 SQL 的语法规则:未加引号的字母被强制转换为小写,而双引号(")保护字母不进行大小写转换,并允许将空白合并到标识符中。在双引号内,成对的双引号在结果名称中减少为一个双引号。例如,FOO"BAR"BAZ 被解释为 fooBARbaz,而 "A weird"" name" 变为 A weird" name。

参数解析在行尾或找到另一个未加引号的反斜杠时停止。未加引号的反斜杠被视为新元命令的开始。特殊序列 \(两个反斜杠)标记参数结束并继续解析 SQL 命令(如果有)。这样,SQL 和 psql 命令可以在行上自由混合。但无论如何,元命令的参数不能延续到行尾之后。

许多元命令作用于当前查询缓冲区。这只是一个缓冲区,保存已键入但尚未发送到服务器执行的任何 SQL 命令文本。这将包括先前的输入行以及同一行上出现在元命令之前的任何文本。

许多元命令还允许附加 x 作为选项。这将导致结果以扩展模式显示,就像使用了 \x 或 \pset expanded 一样。

定义了以下元命令:

\a
如果当前表格输出格式是非对齐的,则切换到对齐。如果不是非对齐的,则设置为非对齐。保留此命令是为了向后兼容。有关更通用的解决方案,请参阅 \pset。

\bind [ 参数 ] ...
设置下一个查询执行的查询参数,指定的参数传递给任何参数占位符($1 等)。

示例:

INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g

这也适用于 \g 以外的查询执行命令,例如 \gx 和 \gset。

此命令导致使用扩展查询协议,与使用简单查询协议的普通 psql 操作不同。因此,此命令可用于从 psql 测试扩展查询协议。(即使查询没有参数且此命令指定零个参数,也使用扩展查询协议。)此命令仅影响下一个执行的查询;默认情况下,所有后续查询将使用简单查询协议。

\bind_named 语句名 [ 参数 ] ...
\bind_named 等同于 \bind,只是它接受现有预备语句的名称作为第一个参数。空字符串表示未命名的预备语句。

示例:

INSERT INTO tbls1 VALUES ($1, $2) \parse stmt1
\bind_named stmt1 'first value' 'second value' \g

此命令导致使用扩展查询协议,与使用简单查询协议的普通 psql 操作不同。因此,此命令可用于从 psql 测试扩展查询协议。

\c 或 \connect [ -reuse-previous=on|off ] [ 数据库名 [ 用户名 ] [ 主机 ] [ 端口 ] | conninfo ]
建立到 PostgreSQL 服务器的新连接。要使用的连接参数可以使用位置语法(数据库名、用户、主机和端口中的一个或多个)指定,或使用 conninfo 连接字符串指定。如果未给出任何参数,则使用与之前相同的参数建立新连接。

将 dbname、username、host 或 port 中的任何一个指定为 - 等同于省略该参数。

新连接可以重用先前连接的连接参数;不仅是数据库名、用户、主机和端口,还有其他设置,如 sslmode。默认情况下,在位置语法中重用参数,但在给出 conninfo 字符串时不重用。传递第一个参数 -reuse-previous=on 或 -reuse-previous=off 会覆盖该默认值。如果参数被重用,则任何未在位置参数或 conninfo 字符串中显式指定的参数都将从现有连接的参数中获取。一个例外是,如果使用位置语法将主机设置从其先前的值更改,则现有连接参数中存在的任何 hostaddr 设置都会被丢弃。此外,仅当用户、主机和端口设置未更改时,才会重用用于现有连接的任何密码。当命令既未指定也未重用特定参数时,将使用 libpq 默认值。

如果成功建立新连接,则先前的连接将关闭。如果连接尝试失败(错误的用户名、访问被拒绝等),并且 psql 处于交互模式,则将保留先前的连接。但在执行非交互式脚本时,旧连接将关闭并报告错误。这可能会也可能不会终止脚本;如果没有,所有访问数据库的命令都将失败,直到另一个 \connect 命令成功执行为止。选择这种区别是为了方便用户一方面防止拼写错误,另一方面作为一种安全机制,防止脚本意外地对错误的数据库进行操作。请注意,每当 \connect 命令尝试重用参数时,重用的值是最后一次成功连接的值,而不是随后任何失败尝试的值。但是,在非交互式 \connect 失败的情况下,不允许以后重用任何参数,因为脚本可能期望重用失败的 \connect 中的值。

示例:

=> \c mydb myuser host.dom 6432
=> \c service=foo
=> \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable"
=> \c -reuse-previous=on sslmode=require    -- 仅更改 sslmode
=> \c postgresql://tom@localhost/mydb?application_name=myapp

\C [ 标题 ]
设置作为查询结果打印的任何表格的标题,或取消设置任何此类标题。此命令等效于 \pset title title。(此命令的名称来源于“caption”,因为它以前仅用于设置 HTML 表格中的标题。)

\cd [ 目录 ]
将当前工作目录更改为 directory。如果没有参数,则更改为当前用户的主目录。

提示
要打印您当前的工作目录,请使用 ! pwd。

\close_prepared 预备语句名
关闭指定的预备语句。空字符串表示未命名的预备语句。如果不存在具有此名称的预备语句,则此操作无效。

示例:

SELECT $1 \parse stmt1
\close_prepared stmt1

此命令导致使用扩展查询协议,与使用简单查询协议的普通 psql 操作不同。因此,此命令可用于从 psql 测试扩展查询协议。

\conninfo
输出有关当前数据库连接的信息,包括如果使用 SSL 则包括 SSL 相关信息。

请注意,客户端用户字段显示连接时的用户,而超级用户字段指示当前用户(在当前执行上下文中)是否具有超级用户权限。这些用户通常是相同的,但它们可能不同,例如,如果当前用户使用 SET ROLE 命令更改。

\copy { 表 [ ( 列列表 ) ] } from { '文件名' | program '命令' | stdin | pstdin } [ [ with ] ( 选项 [, ...] ) ] [ where 条件 ]
\copy { 表 [ ( 列列表 ) ] | ( 查询 ) } to { '文件名' | program '命令' | stdout | pstdout } [ [ with ] ( 选项 [, ...] ) ]
执行前端(客户端)复制。这是一个运行 SQL COPY 命令的操作,但不是服务器读取或写入指定文件,而是 psql 读取或写入文件并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要 SQL 超级用户权限。

当指定 program 时,命令由 psql 执行,并且从命令传递或向命令传递的数据在服务器和客户端之间路由。同样,执行权限是本地用户的权限,而不是服务器的权限,并且不需要 SQL 超级用户权限。

对于 \copy ... from stdin,数据行从发出命令的同一源读取,直到读取到仅包含 . 的行或流到达 EOF。此选项对于在 SQL 脚本文件中内联填充表很有用。对于 \copy ... to stdout,输出发送到与 psql 命令输出相同的位置,并且不打印 COPY 计数命令状态(因为它可能与数据行混淆)。要无论当前命令源或 \o 选项如何都读取/写入 psql 的标准输入或输出,请写入 from pstdin 或 to pstdout。

此命令的语法类似于 SQL COPY 命令。除数据源/目标之外的所有选项都按照 COPY 的规定指定。因此,特殊的解析规则适用于 \copy 元命令。与大多数其他元命令不同,行的整个其余部分始终被视为 \copy 的参数,并且参数中不执行变量插值或反引号扩展。

提示
获得与 \copy ... to 相同结果的另一种方法是使用 SQL COPY ... TO STDOUT 命令并使用 \g 文件名 或 \g |program 终止它。与 \copy 不同,此方法允许命令跨越多行;此外,可以使用变量插值和反引号扩展。

提示
这些操作的效率不如具有文件或程序数据源或目标的 SQL COPY 命令,因为所有数据都必须通过客户端/服务器连接。对于大量数据,SQL 命令可能更可取。

\copyright
显示 PostgreSQL 的版权和分发条款。

\crosstabview [ 列V [ 列H [ 列D [ 排序列H ] ] ] ]
执行当前查询缓冲区(如 \g)并在交叉表网格中显示结果。查询必须返回至少三列。由 colV 标识的输出列成为垂直标题,由 colH 标识的输出列成为水平标题。colD 标识要在网格内显示的输出列。sortcolH 标识水平标题的可选排序列。

每个列规范可以是列号(从 1 开始)或列名。通常的 SQL 大小写折叠和引用规则适用于列名。如果省略,colV 被视为第 1 列,colH 被视为第 2 列。colH 必须不同于 colV。如果未指定 colD,则查询结果必须正好有三列,并且既不是 colV 也不是 colH 的列被视为 colD。

垂直标题显示为最左边的列,包含在列 colV 中找到的值,顺序与查询结果中的顺序相同,但重复项已删除。

水平标题显示为第一行,包含在列 colH 中找到的值,重复项已删除。默认情况下,这些值以与查询结果中相同的顺序出现。但如果给出了可选的 sortcolH 参数,它会标识一个其值必须为整数的列,并且 colH 中的值将根据相应的 sortcolH 值排序后出现在水平标题中。

在交叉表网格内部,对于 colH 的每个不同值 x 和 colV 的每个不同值 y,位于交点 (x,y) 的单元格包含查询结果行中 colD 列的值,其中该行的 colH 值为 x,colV 值为 y。如果没有这样的行,则该单元格为空。如果有多个这样的行,则会报告错误。

\d[Sx+] [ 模式 ]
对于每个与模式匹配的关系(表、视图、物化视图、索引、序列或外部表)或复合类型,显示所有列、它们的类型、表空间(如果不是默认值)以及任何特殊属性,例如 NOT NULL 或默认值。还会显示关联的索引、约束、规则和触发器。对于外部表,还会显示关联的外部服务器。(“匹配模式”的定义见下面的模式。)

对于某些类型的关系,\d 会为每个列显示附加信息:序列的列值、索引的索引表达式以及外部表的外部数据包装器选项。

命令形式 \d+ 是相同的,只是显示更多信息:显示与表列关联的任何注释,以及表中 OID 的存在(如果有)、如果关系是视图则显示视图定义、非默认副本标识设置以及如果关系有访问方法则显示访问方法名称。

默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。

注意
如果 \d 在没有模式参数的情况下使用,它等效于 \dtvmsE,它将显示所有可见表、视图、物化视图、序列和外部表的列表。这纯粹是一种便利措施。

与许多其他命令一样,如果命令名称后附加了 x,则结果以扩展模式显示,但请注意,这仅当 \d 在没有模式参数的情况下使用时适用,并且 x 修饰符不能紧跟在 \d 之后(因为 \dx 是一个不同的命令);x 修饰符只能出现在 S 或 + 修饰符之后。例如,\d+x 等效于 \dtvmsE+x,并将以扩展模式显示所有关系的列表。

\da[Sx] [ 模式 ]
列出聚合函数,以及它们的返回类型和操作的数据类型。如果指定了 pattern,则仅显示名称与模式匹配的聚合函数。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果 x 附加到命令名称,则结果以扩展模式显示。

\dA[x+] [ 模式 ]
列出访问方法。如果指定了 pattern,则仅显示名称与模式匹配的访问方法。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个访问方法都与其关联的处理函数和描述一起列出。

\dAc[x+] [访问方法模式 [输入类型模式]]
列出操作符类。如果指定了 access-method-pattern,则仅列出与名称与该模式匹配的访问方法关联的操作符类。如果指定了 input-type-pattern,则仅列出与名称与该模式匹配的输入类型关联的操作符类。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个操作符类都与其关联的操作符族和所有者一起列出。

\dAf[x+] [访问方法模式 [输入类型模式]]
列出操作符族。如果指定了 access-method-pattern,则仅列出与名称与该模式匹配的访问方法关联的操作符族。如果指定了 input-type-pattern,则仅列出与名称与该模式匹配的输入类型关联的操作符族。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个操作符族都与其所有者一起列出。

\dAo[x+] [访问方法模式 [操作符族模式]]
列出与操作符族关联的操作符。如果指定了 access-method-pattern,则仅列出与名称与该模式匹配的访问方法关联的操作符族的成员。如果指定了 operator-family-pattern,则仅列出名称与该模式匹配的操作符族的成员。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个操作符都与其排序操作符族(如果是排序操作符)以及其底层函数是否防泄漏一起列出。

\dAp[x+] [访问方法模式 [操作符族模式]]
列出与操作符族关联的支持函数。如果指定了 access-method-pattern,则仅列出与名称与该模式匹配的访问方法关联的操作符族的函数。如果指定了 operator-family-pattern,则仅列出名称与该模式匹配的操作符族的函数。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则函数会详细显示,并显示其实际参数列表。

\db[x+] [ 模式 ]
列出表空间。如果指定了 pattern,则仅显示名称与模式匹配的表空间。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个表空间都与其关联的选项、磁盘上大小、权限和描述一起列出。

\dc[Sx+] [ 模式 ]
列出字符集编码之间的转换。如果指定了 pattern,则仅列出名称与模式匹配的转换。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果 x 附加到命令名称,则结果以扩展模式显示。如果 + 附加到命令名称,则每个对象都与其关联的描述一起列出。

相关文章
|
5天前
|
数据采集 人工智能 安全
|
15天前
|
云安全 监控 安全
|
1天前
|
存储 SQL 大数据
删库跑路?别慌!Time Travel 带你穿回昨天的数据世界
删库跑路?别慌!Time Travel 带你穿回昨天的数据世界
234 156
|
8天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
595 5
|
11天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
771 152
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1870 9
|
2天前
|
机器学习/深度学习 人工智能 监控
别把模型当宠物养:从 CI/CD 到 MLOps 的工程化“成人礼”
别把模型当宠物养:从 CI/CD 到 MLOps 的工程化“成人礼”
217 163