如何查询数据库中所有域的定义?

How can I query for the definitions of all domains in the database?

我正在尝试找到一种方法来 运行 SELECT 查询(不是某些管理命令),returns Postgres 数据库中每个域类型的定义。具体来说,我想知道:

尝试 Google 这很棘手,因为在 Postgres 中搜索有关查询自定义类型定义的信息会出于某种原因给出大量关于 enums 的结果,但是对域没有任何用处。有谁知道如何从 Postgres 元数据中检索域定义?

这 returns 您要求的内容,以及一些可能相关的更多列:

SELECT n.nspname AS schema
     , t.typname AS name
     , pg_catalog.format_type(t.typbasetype, t.typtypmod) AS underlying_type
     , t.typnotnull AS not_null
       
     , (SELECT c.collname
        FROM   pg_catalog.pg_collation c, pg_catalog.pg_type bt
        WHERE  c.oid = t.typcollation AND bt.oid = t.typbasetype AND t.typcollation <> bt.typcollation) AS collation
     , t.typdefault AS default
     , pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.pg_get_constraintdef(r.oid, TRUE) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid), ' ') AS check_constraints
FROM   pg_catalog.pg_type t
LEFT   JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE  t.typtype = 'd'  -- domains
AND    n.nspname <> 'pg_catalog'
AND    n.nspname <> 'information_schema'
AND    pg_catalog.pg_type_is_visible(t.oid)
ORDER  BY 1, 2;

db<>fiddle here

要获取 Postgres 数据库中的每个域类型,请删除添加的过滤器:

AND    n.nspname <> 'pg_catalog'
AND    n.nspname <> 'information_schema'
AND    pg_catalog.pg_type_is_visible(t.oid)

但您可能只需要可见的用户域。

阅读有关 pg_type 的手册。

在 psql 中使用 \dD。如果您在设置 \set ECHO_HIDDEN on 后执行此操作,您还会看到用于生成该输出的查询。您会发现与我上面的查询有相似之处(提示!)。