Postgres \d+(显示关系信息)等效于 sql

Postgres \d+ (show relation information) equivalent via sql

我见过几个这样的例子 here or here

我能做我能做的大部分事情,但不是全部。

如果我有:

\d+ myschema.mytable

我列出了所有列和索引。索引的格式例如:

Indexes:
    "id_pkey" PRIMARY KEY, btree (id,name,timestamp)
    "ix05_id" btree (name,company)

我能够通过 sql 获取列,对于索引和键,我从上面 post 中找到了一些 sql 但不完全是那种格式.

所以对于键我能够做到:

SELECT               
  pg_attribute.attname, 
  format_type(pg_attribute.atttypid, pg_attribute.atttypmod) 
FROM pg_index, pg_class, pg_attribute, pg_namespace 
WHERE 
  pg_class.oid = 'mytable'::regclass AND 
  indrelid = pg_class.oid AND 
  nspname = 'myschema' AND 
  pg_class.relnamespace = pg_namespace.oid AND 
  pg_attribute.attrelid = pg_class.oid AND 
  pg_attribute.attnum = any(pg_index.indkey)
 AND indisprimary

所以这个提取键适用的列,而不是 index/key 的名称?如何在上面的查询中添加它?我需要加入什么table?

对于我能够做的索引

SELECT * FROM pg_indexes WHERE tablename = 'mytable' AND schemaname = 'myschema' ;

它获取索引,但没有明确列出它们应用到的列 - 我只看到它们是如何创建的 indexdef?我可以通过加入其他 table 来获取该信息,还是我必须解析 indexdef 并获取索引适用的列?

psql has a -E option:

-E
--echo-hidden

Echo the actual queries generated by \d and other backslash commands. You can use this to study psql's internal operations. This is equivalent to setting the variable ECHO_HIDDEN to on.

因此,如果您 运行 psql -E 并执行 \d+ myschema.mytable,您应该确切地看到内部执行了哪些 SQL 查询。