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

Posted

技术标签:

【中文标题】如何查询数据库中所有域的定义?【英文标题】:How can I query for the definitions of all domains in the database? 【发布时间】:2021-07-04 22:34:50 【问题描述】:

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

架构 姓名 基础类型 空/非空

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

【问题讨论】:

请参阅此处Types 特别是typtype 列。 @AdrianKlaver 看起来typtype 会告诉我“这是一个域”,这很有用,但它不会告诉我“这是一个代表varchar(20) not null 的域”,这就是我想要弄清楚的。 【参考方案1】:

这将返回您要求的内容,以及一些可能相关的列:

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小提琴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 后执行此操作,您还将看到用于生成该输出的查询。您会发现与我上面的查询有相似之处(提示!)。

【讨论】:

以上是关于如何查询数据库中所有域的定义?的主要内容,如果未能解决你的问题,请参考以下文章

将所有域的所有站点重定向到新域,而不使用尾随查询字符串

Firebase 大查询 - 如何从自定义事件表中检索数据

sql SFMC - 电子邮件域的SQL查询数据扩展

如何在 graphQL 片段中定义可选字段以进行查询

存储在 Oracle 数据库中执行的所有查询

如何查询oracle数据库中的所有用户名