【问题标题】:How can I query for the definitions of all domains in the database?如何查询数据库中所有域的定义?
【发布时间】:2023-03-11 10:30:02
【问题描述】:

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

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

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

【问题讨论】:

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

标签: sql postgresql database-metadata


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2021-12-13
    • 2019-10-26
    相关资源
    最近更新 更多