PostgreSQL \d命令:有没有办法只“选择”一列?

9w11ddsr  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(4)|浏览(178)

与大多数SQL衍生工具不同,PostgreSQL不使用传统的DESCRIBE TABLE foo语法;它使用\d foo(来自psql解释器)。
这很好,除了(特别是当我在一个有限宽度的终端中打开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  |

nue99wik

nue99wik1#

\d输出的实际子集

是的。通过将ECHO-HIDDEN设置为on来打开引擎盖,扔掉任何你不喜欢的东西,只抓取你想要的东西。输出的每一部分都可以自己工作。
-E--echo-hidden回显\d和其他反斜杠命令生成的实际查询。可以用它来研究psql的内部操作。这相当于将变量ECHO_HIDDEN设置为on
PostgreSQL不理解\d。它是psql的内部元命令,psql和其他客户端一样。您看到的数据是客户端发出一系列查询并将其输出粘合在一起的结果-上面的设置可以让您了解这些查询是什么。您可以“手动”使用它们,甚至重新排列它们以更好地满足您的目的。

终端宽度

您可能想查看expanded模式。psql提供多种输出格式可供选择:wrapped的宽度是可调的columns。你也应该在它的属性中控制你的终端屏幕缓冲区的布局-在那里,你可以增加宽度,当某些东西太宽时,你可以向右滚动,如果你想的话,或者只是让它伸出屏幕。

查询结构/schema

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

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

字符串
该模式中的视图指向相同的位置。当您运行\d时,psql获取表和视图的列列表。实际数据位于psql直接查询的系统目录中。

bvn4nwqk

bvn4nwqk2#

您应该检查命令\gdesc,它描述了查询将具有的结果列。
假设你有一个简单的三列表。

SELECT * FROM sample_table \gdesc

字符串
你得到的结果是

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


我也鼓励你检查this thread

zyfwsgd6

zyfwsgd63#

直接使用系统目录pg_attribute

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

字符串
pg_attribute存储表类对象的列名,例如表,索引,视图等。'users'::regclass将表名转换为attrelid所需的oidattnum > 0消除了系统列cmaxcminctid等。

cgh8pdjw

cgh8pdjw4#

您可以使用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();

相关问题