显示用户定义的类型及其详细信息

nav*_*ige 23 postgresql catalogs user-defined-type

我在 PostgreSQL 中创建了一些新的 UDT。但是,现在我有两个问题:

  1. 如何查看定义了哪些 UDT?
  2. 如何查看这些 UDT 中定义的列?

不幸的是,我在 PostgreSQL 文档中找不到任何相关内容。

gsi*_*ems 27

这会让你开始吗?

SELECT n.nspname AS schema,
        pg_catalog.format_type ( t.oid, NULL ) AS name,
        t.typname AS internal_name,
        CASE
            WHEN t.typrelid != 0
            THEN CAST ( 'tuple' AS pg_catalog.text )
            WHEN t.typlen < 0
            THEN CAST ( 'var' AS pg_catalog.text )
            ELSE CAST ( t.typlen AS pg_catalog.text )
        END AS size,
        pg_catalog.array_to_string (
            ARRAY( SELECT e.enumlabel
                    FROM pg_catalog.pg_enum e
                    WHERE e.enumtypid = t.oid
                    ORDER BY e.oid ), E'\n'
            ) AS elements,
        pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description
    FROM pg_catalog.pg_type t
    LEFT JOIN pg_catalog.pg_namespace n
        ON n.oid = t.typnamespace
    WHERE ( t.typrelid = 0
            OR ( SELECT c.relkind = 'c'
                    FROM pg_catalog.pg_class c
                    WHERE c.oid = t.typrelid
                )
        )
        AND NOT EXISTS
            ( SELECT 1
                FROM pg_catalog.pg_type el
                WHERE el.oid = t.typelem
                    AND el.typarray = t.oid
            )
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND pg_catalog.pg_type_is_visible ( t.oid )
    ORDER BY 1, 2;
Run Code Online (Sandbox Code Playgroud)

在 psql 中,您可以\set ECHO_HIDDEN on让 psql 显示用于生成\d...命令输出的查询。我发现这些查询作为从数据库中挖掘元数据时的起点非常有用。

更新:2019-12-16

对于复合类型,可以使用以下内容确定列元数据:

WITH types AS (
    SELECT n.nspname,
            pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
            CASE
                WHEN t.typrelid != 0 THEN CAST ( 'tuple' AS pg_catalog.text )
                WHEN t.typlen < 0 THEN CAST ( 'var' AS pg_catalog.text )
                ELSE CAST ( t.typlen AS pg_catalog.text )
                END AS obj_type,
            coalesce ( pg_catalog.obj_description ( t.oid, 'pg_type' ), '' ) AS description
        FROM pg_catalog.pg_type t
        JOIN pg_catalog.pg_namespace n
            ON n.oid = t.typnamespace
        WHERE ( t.typrelid = 0
                OR ( SELECT c.relkind = 'c'
                        FROM pg_catalog.pg_class c
                        WHERE c.oid = t.typrelid ) )
            AND NOT EXISTS (
                    SELECT 1
                        FROM pg_catalog.pg_type el
                        WHERE el.oid = t.typelem
                        AND el.typarray = t.oid )
            AND n.nspname <> 'pg_catalog'
            AND n.nspname <> 'information_schema'
            AND n.nspname !~ '^pg_toast'
),
cols AS (
    SELECT n.nspname::text AS schema_name,
            pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
            a.attname::text AS column_name,
            pg_catalog.format_type ( a.atttypid, a.atttypmod ) AS data_type,
            a.attnotnull AS is_required,
            a.attnum AS ordinal_position,
            pg_catalog.col_description ( a.attrelid, a.attnum ) AS description
        FROM pg_catalog.pg_attribute a
        JOIN pg_catalog.pg_type t
            ON a.attrelid = t.typrelid
        JOIN pg_catalog.pg_namespace n
            ON ( n.oid = t.typnamespace )
        JOIN types
            ON ( types.nspname = n.nspname
                AND types.obj_name = pg_catalog.format_type ( t.oid, NULL ) )
        WHERE a.attnum > 0
            AND NOT a.attisdropped
)
SELECT cols.schema_name,
        cols.obj_name,
        cols.column_name,
        cols.data_type,
        cols.ordinal_position,
        cols.is_required,
        coalesce ( cols.description, '' ) AS description
    FROM cols
    ORDER BY cols.schema_name,
            cols.obj_name,
            cols.ordinal_position ;
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 20

默认客户端具有涵盖以下内容的功能:

管理员 3

旧的默认 GUI(最多 Postgres 10)。

pgAdmin3 中的类型

确保在对象浏览器中启用了类型:选项 - 浏览器 - 显示

管理员 4

新的默认 GUI。

pgAdmin4 中的类型

确保在对象浏览器中启用了类型:文件 - 首选项 - 浏览器 - 节点

在左侧,您会看到所选模式中的用户定义类型。(问题

SQL pane向右具有所选类型的反向工程SQL脚本。(问题

其他窗格中的更多详细信息,例如Dependents等。

查询语句

标准的交互式控制台。

  1. \dT 获取用户定义类型的列表。
  2. \d type_name 获取给定类型的列定义列表。

手册:

\d[S+] [ pattern ]

对于匹配模式的每个关系(表、视图、物化视图、索引、序列或外部表)或复合类型,显示所有列、它们的类型、[...]

大胆强调我的。至少从 Postgres 9.1 开始,该命令也适用于复合类型。

和:

\dT[S+] [ pattern ]

列出数据类型。如果指定了模式,则仅列出名称与模式匹配的类型。如果+附加到命令名称,则列出每个类型及其内部名称和大小、允许的值(如果它是一种enum类型)及其关联的权限。默认情况下,只显示用户创建的对象;提供模式或 S修饰符以包含系统对象。

  • JetBrains IDE 有一个数据库插件(也打包为一个名为 DataGrip 的独立产品),它以与此处显示的 PGAdmin 类似的方式显示用户定义的类型。 (2认同)

小智 12

尝试执行这段代码:

SELECT
    pg_type.typname, 
     pg_enum.enumlabel
FROM
    pg_type 
JOIN
    pg_enum ON pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)

  • 我从这个查询中没有得到任何结果。不确定数据应该是什么样子。 (2认同)