在 psql
(PostgreSQL 的命令行工具)中,-E
或 --echo-hidden
选项用于在将查询发送到服务器之前显示它。这通常用于调试目的,因为它允许用户看到 psql
如何解释和可能修改(例如,通过变量替换)他们的查询。
1、先看一个选择题目
如果要查看psql的元命令(比如\du,\d,\dt)使用到查询语句,可以通过那种方式实现
✔ A、psql --echo-hidden
✘ B、psql -e
✔ C、psql -E
✔ D、进入psql后设置 \set ECHO_HIDDEN on
✘ E、psql --echo_hidden off
答案解析
查看psql元命令(比如\du,\d,\dt)使用到查询语句
psql 指定-E (短选项)
–echo-hidden (长选项)
登录后设置\set ECHO_HIDDEN ON
-E
或 --echo-hidden
2、使用 当你运行 psql
并希望查看发送给服务器的实际查询时,可以在命令行中包含 -E
或 --echo-hidden
选项。例如:
psql -U username -d databasename -E
或者,使用长选项:
psql --username=username --dbname=databasename --echo-hidden
在这两种情况下,当你执行 SQL 查询时,psql
会在将查询发送到 PostgreSQL 服务器之前,在命令行界面中显示该查询。这对于理解 psql
如何处理查询(特别是包含变量和特殊命令的查询)非常有用。
3、示例
假设你有一个名为 t_datax_pg
的表,并且你希望使用 psql
的变量替换功能来动态地设置查询条件。你可以这样做:
\set myvar 'oracle19c'
SELECT * FROM t_datax_pg WHERE pdf_file = :'myvar';
如果你没有使用 -E
或 --echo-hidden
选项,psql
将不会显示它实际发送给服务器的查询,因为变量替换是在客户端完成的。但是,如果你使用了这些选项之一,你将看到类似下面的输出(注意查询中的变量替换):
SELECT * FROM t_datax_pg WHERE pdf_file = 'oracle19c';
这将帮助你验证 psql
是否按照你的预期处理了查询。
superdb=# select * from t_datax_pg;
id | pdf_file | create_time | edit_time
----+--------------------------+----------------------------+----------------------------
1 | datax | 2023-07-04 11:39:55 | 2023-07-04 11:39:55
2 | oracle19c | 2023-07-04 11:39:56 | 2023-07-04 11:39:56
3 | to | 2023-07-04 12:04:19 | 2023-07-04 12:04:19
4 | mysql | 2023-07-04 12:04:26 | 2023-07-04 12:04:26
5 | where | 2023-07-04 13:39:11 | 2023-07-04 13:39:11
superdb=# \d t_datax_pg
Table "public.t_datax_pg"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
id | integer | | not null |
pdf_file | character varying(256) | | |
create_time | timestamp without time zone | | |
edit_time | timestamp without time zone | | |
Indexes:
"t_datax_pg_pkey" PRIMARY KEY, btree (id)
Publications:
"dbz_publication"
3.1、登录后设置\set ECHO_HIDDEN ON
superdb=# \set ECHO_HIDDEN on
superdb=# \set myvar 'oracle19c'
superdb=# select * from t_datax_pg where pdf_file=:'myvar';
id | pdf_file | create_time | edit_time
----+-----------+---------------------+---------------------
2 | oracle19c | 2023-07-04 11:39:56 | 2023-07-04 11:39:56
(1 row)
superdb=# \d t_datax_pg
********* QUERY **********
SELECT c.oid,
n.nspname,
c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname OPERATOR(pg_catalog.~) '^(t_datax_pg)$' COLLATE pg_catalog.default
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3;
**************************
********* QUERY **********
SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, false AS relhasoids, c.relispartition, '', c.reltablespace, CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, c.relpersistence, c.relreplident, am.amname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)
LEFT JOIN pg_catalog.pg_am am ON (c.relam = am.oid)
WHERE c.oid = '1089976';
**************************
********* QUERY **********
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod),
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid, true) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
a.attnotnull,
(SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t
WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation,
a.attidentity,
a.attgenerated
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = '1089976' AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum;
**************************
********* QUERY **********
SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),
pg_catalog.pg_get_constraintdef(con.oid, true), contype, condeferrable, condeferred, i.indisreplident, c2.reltablespace
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x'))
WHERE c.oid = '1089976' AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname;
**************************
********* QUERY **********
SELECT pol.polname, pol.polpermissive,
CASE WHEN pol.polroles = '{0}' THEN NULL ELSE pg_catalog.array_to_string(array(select rolname from pg_catalog.pg_roles where oid = any (pol.polroles) order by 1),',') END,
pg_catalog.pg_get_expr(pol.polqual, pol.polrelid),
pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid),
CASE pol.polcmd
WHEN 'r' THEN 'SELECT'
WHEN 'a' THEN 'INSERT'
WHEN 'w' THEN 'UPDATE'
WHEN 'd' THEN 'DELETE'
END AS cmd
FROM pg_catalog.pg_policy pol
WHERE pol.polrelid = '1089976' ORDER BY 1;
**************************
********* QUERY **********
SELECT oid, stxrelid::pg_catalog.regclass, stxnamespace::pg_catalog.regnamespace AS nsp, stxname,
(SELECT pg_catalog.string_agg(pg_catalog.quote_ident(attname),', ')
FROM pg_catalog.unnest(stxkeys) s(attnum)
JOIN pg_catalog.pg_attribute a ON (stxrelid = a.attrelid AND
a.attnum = s.attnum AND NOT attisdropped)) AS columns,
'd' = any(stxkind) AS ndist_enabled,
'f' = any(stxkind) AS deps_enabled,
'm' = any(stxkind) AS mcv_enabled
FROM pg_catalog.pg_statistic_ext stat WHERE stxrelid = '1089976'
ORDER BY 1;
**************************
********* QUERY **********
SELECT pubname
FROM pg_catalog.pg_publication p
JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid
WHERE pr.prrelid = '1089976'
UNION ALL
SELECT pubname
FROM pg_catalog.pg_publication p
WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('1089976')
ORDER BY 1;
**************************
********* QUERY **********
SELECT c.oid::pg_catalog.regclass FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhparent AND i.inhrelid = '1089976' AND c.relkind != 'p' ORDER BY inhseqno;
**************************
********* QUERY **********
SELECT c.oid::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, c.oid), c.relkind FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i WHERE c.oid=i.inhrelid AND i.inhparent = '1089976' ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT', c.oid::pg_catalog.regclass::pg_catalog.text;
**************************
Table "public.t_datax_pg"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
id | integer | | not null |
pdf_file | character varying(256) | | |
create_time | timestamp without time zone | | |
edit_time | timestamp without time zone | | |
Indexes:
"t_datax_pg_pkey" PRIMARY KEY, btree (id)
Publications:
"dbz_publication"
-E
或 --echo-hidden
选项
3.2、使用 [pgsql@pgstandby:/home/pgsql]$psql -h 10.20.33.249 -p 5432 -U super -d superdb -W -E
Password:
psql (12.2)
Type "help" for help.
superdb=# \set myvar 'oracle19c'
superdb=# select * from t_datax_pg where pdf_file=:'myvar';
id | pdf_file | create_time | edit_time
----+-----------+---------------------+---------------------
2 | oracle19c | 2023-07-04 11:39:56 | 2023-07-04 11:39:56
(1 row)
superdb=# \set myvar 41
superdb=# select * from t_datax_pg where id=:myvar;
id | pdf_file | create_time | edit_time
----+------------+----------------------------+---------------------
41 | 中秋节加班 | 2024-09-12 10:17:23.989596 | 2024-09-12 10:17:20
(1 row)
4、注意
- 使用
-E
或--echo-hidden
可能会使输出变得混乱,特别是当你执行包含大量 SQL 语句的脚本时。 - 这个选项主要用于调试和学习目的,而不是日常生产使用。
- 在某些情况下,
psql
可能会隐藏或修改发送给服务器的查询的某些部分(例如,密码或敏感信息),但-E
或--echo-hidden
仍然会显示尽可能多的信息。
5、psql提供了许多元命令(或称为内部命令、斜杠命令)
在 PostgreSQL 中,psql
是一个功能强大的命令行工具,用于与 PostgreSQL 数据库服务器进行交互。psql
提供了许多元命令(或称为内部命令、斜杠命令),这些命令用于管理 psql
会话、查询数据库元数据、格式化输出等,而不是直接对数据库中的数据进行 SQL 操作。
以下是一些常用的 psql
元命令及其简要说明:
\?
或\help
:显示所有\
开头的元命令的帮助信息。\c [DBNAME [USERNAME] [HOST] [PORT]]
或\connect
:连接到新数据库。可以指定数据库名、用户名、主机名和端口号。\d [NAME|*]
或\dt
、\di
、\ds
、\dv
等:列出表、索引、序列、视图等数据库对象的信息。\d
后可以跟特定的对象名或通配符。\di+
:以更详细的格式列出索引信息。\dt+
:以更详细的格式列出表信息。\df
:列出函数。\dn
:列出模式(schemas)。\dp
:列出表的权限。\dx
:列出已安装的扩展。\q
:退出psql
会话。\e
:将当前查询缓冲区的内容发送到文本编辑器中(如果设置了EDITOR
环境变量)。\g [FILE]
或\gexec
:执行查询缓冲区中的命令,并将结果发送到标准输出或指定的文件中。\gdesc
:仅显示查询结果的列标题,不显示数据。\T [STRING]
:设置查询结果的表标题。\timing
:切换显示每个查询执行时间的功能。\watch [SECONDS]
:定期执行查询缓冲区中的命令。
要查看 psql
的所有元命令及其详细说明,你可以在 psql
命令行中输入 \?
或 \help
。这将列出所有可用的元命令以及一个简短的描述。
请注意,这些元命令的可用性可能会随着 PostgreSQL 版本的更新而略有变化。因此,建议查阅你所使用的 PostgreSQL 版本的官方文档以获取最准确的信息。