如何查询数据库中所有域的定义?
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
后执行此操作,您还将看到用于生成该输出的查询。您会发现与我上面的查询有相似之处(提示!)。
【讨论】:
以上是关于如何查询数据库中所有域的定义?的主要内容,如果未能解决你的问题,请参考以下文章