postgresql数据库查看元命令

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

2、使用 -E--echo-hidden

当你运行 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"

3.2、使用 -E--echo-hidden 选项

[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 元命令及其简要说明:

  1. \?\help:显示所有 \ 开头的元命令的帮助信息。
  2. \c [DBNAME [USERNAME] [HOST] [PORT]]\connect:连接到新数据库。可以指定数据库名、用户名、主机名和端口号。
  3. \d [NAME|*]\dt\di\ds\dv 等:列出表、索引、序列、视图等数据库对象的信息。\d 后可以跟特定的对象名或通配符。
  4. \di+:以更详细的格式列出索引信息。
  5. \dt+:以更详细的格式列出表信息。
  6. \df:列出函数。
  7. \dn:列出模式(schemas)。
  8. \dp:列出表的权限。
  9. \dx:列出已安装的扩展。
  10. \q:退出 psql 会话。
  11. \e:将当前查询缓冲区的内容发送到文本编辑器中(如果设置了 EDITOR 环境变量)。
  12. \g [FILE]\gexec:执行查询缓冲区中的命令,并将结果发送到标准输出或指定的文件中。
  13. \gdesc:仅显示查询结果的列标题,不显示数据。
  14. \T [STRING]:设置查询结果的表标题。
  15. \timing:切换显示每个查询执行时间的功能。
  16. \watch [SECONDS]:定期执行查询缓冲区中的命令。

要查看 psql 的所有元命令及其详细说明,你可以在 psql 命令行中输入 \?\help。这将列出所有可用的元命令以及一个简短的描述。

请注意,这些元命令的可用性可能会随着 PostgreSQL 版本的更新而略有变化。因此,建议查阅你所使用的 PostgreSQL 版本的官方文档以获取最准确的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值