PostgreSQL \d 命令:有什么方法可以只“选择”一列吗?

PostgreSQL \d Commands: Any way to "select" only one column?

提问人:machineghost 提问时间:11/12/2023 更新时间:11/12/2023 访问量:67

问:

与大多数 SQL 衍生产品不同,PostgreSQL 不使用传统语法;它使用(来自解释器)。DESCRIBE TABLE foo\d foopsql

这很好,除了(尤其是当我在宽度有限的终端中打开时)可能很难读取 的输出,因为有一堆列和一堆值,它们很难将所有内容排列起来。psql\d

所以,我的简单问题是,当使用及其变体(例如),有没有办法只获得一列输出?例如,如果我这样做,而不是得到:\d\df\d users

                                       Table "public.users"
   Column   |           Type           | Collation | Nullable |              Default              
------------+--------------------------+-----------+----------+-----------------------------------
 id         | integer                  |           | not null | nextval('users_id_seq'::regclass)
 created_at | timestamp with time zone |           | not null | CURRENT_TIMESTAMP
 updated_at | timestamp with time zone |           | not null | CURRENT_TIMESTAMP
 username   | character varying(255)   |           | not null | 
 title      | character varying(500)   |           |          | 
 first_name | character varying(50)    |           |          | 
 last_name  | character varying(50)    |           |          | 

有没有办法(例如,尽管这不起作用)可以得到:\d users Column

                                         Table "public.users"
   Column   |           
------------+
 id         |
 created_at |
 updated_at |
 username   |
 first_name |
 last_name  |
PostgreSQL PSQL

评论


答:

1赞 Moti 11/12/2023 #1

您应该检查命令 \gdesc,它描述了查询将具有的结果列。

因此,假设您有一个包含三列的简单表。如果您像下面这样使用它,那将会有所帮助

SELECT * FROM sample_table \gdesc

您将收到的结果是

   Column   |            Type             
------------+-----------------------------
 id         | uuid
 created_at | timestamp without time zone
 deleted_at | timestamp without time zone
(4 rows)

我也鼓励你检查这个线程

评论

0赞 machineghost 11/12/2023
我可以将它与 及其变体一起使用吗,例如?例如,我能做到吗?\d\df\df some_function \gdesc
0赞 Zegarek 11/12/2023
你不能。或者,您可以,但使用使用的基础查询,而不是使用其本身。\d\d
2赞 Zegarek 11/12/2023 #2

输出的实际子集\d

是的。通过将 ECHO-HIDDEN 设置为打开引擎盖并扔掉任何您不喜欢的东西,只抓住您想要的东西。构建该输出的每个单独部分都可以自行正常工作。

-E --echo-hidden回显 和 其他反斜杠命令生成的实际查询。您可以使用它来研究 psql 的内部操作。这相当于将变量设置为 。\dECHO_HIDDENon

PostgreSQL不明白。它是 的内部元命令,它与其他任何客户端一样。您看到的数据是客户端发出一系列查询并将其输出粘合在一起的结果 - 通过上面的设置,您可以了解这些查询是什么。您可以“手动”使用它们,甚至可以重新排列它们以更好地满足您的目的。\dpsql


端子宽度

您可能需要查看扩展模式。 提供多种输出格式可供选择:宽度可调。您还应该控制终端屏幕缓冲区布局的属性 - 在那里,您可以调高宽度,每当某些东西太宽时,您可以根据需要向右滚动,或者只是让它伸出屏幕外。psqlwrappedcolumns


查询结构/架构

有符合 SQL 标准的 information_schema 命名空间,其中有视图。你可以直接去那里:

select column_name from information_schema.columns
where table_schema='public' and table_name='users';

该架构中的视图指向运行时获取表和视图的列列表的同一位置。实际数据位于直接查询的系统目录中。psql\dpsql

1赞 Adrian Klaver 11/12/2023 #3

直接使用系统目录pg_attribute

SELECT
    attname AS column
FROM
    pg_attribute
WHERE
    attrelid = 'users'::regclass
AND 
    attnum > 0;

pg_attribute存储表(如表、索引、视图等)的列名。将表名转换为 needed for 。 消除系统列 、 、 等。'users'::regclassoidattrelidattnum > 0cmaxcminctid

1赞 Tometzky 11/12/2023 #4

您可以使用 or 或任何其他不会换行的文本编辑器程序作为寻呼机:less -Sleafpad

tometzky=> \setenv PAGER 'less -S'
tometzky=> \setenv PAGER leafpad

或者,您可以查询信息架构以获取具有扩展输出的类似数据:

tometzky=> \x on
Expanded display is on.

tometzky=> select
  column_name,
  is_nullable,
  data_type,
  character_maximum_length
from information_schema.columns
where table_name='users' and table_schema=current_schema();

评论

0赞 Zegarek 11/12/2023
不是试图通过假设他们的平台来冒犯 OP,但这些寻呼机设置在标准的 Windows 环境中不起作用。它会让你声明(或任何与此相关的内容),但一旦你尝试获取东西,就会失败并抱怨。
0赞 Tometzky 11/13/2023
在Windows上,他们也可以使用任何选定的文本编辑器。这些只是例子。我相信像 Notepad++、Sublime Text 或 Visual Studio Code 这样的东西应该可以工作——尽管它们需要找到命令来启动它。不过,如果他们通过 SSH 连接到某些 Linux VM,那就不是那么有用了 - 那么可能是最简单的,而 pspg 是最强大的选择。less -S