如何使用Postgres information_schema列出自定义类型

Col*_*ers 37 sql postgresql

我试图使用information_schema找到等效的\ dT的SQL,似乎找不到任何东西.这样的事情存在吗?

示例:如果我添加以下自定义类型枚举,如何在information_schema中看到它?

CREATE TYPE communication.channels AS ENUM
   ('text_message',
    'email',
    'phone_call',
    'broadcast');
Run Code Online (Sandbox Code Playgroud)

注意:我确实有\ dT使用的确切SQL(通过打开日志记录检索)但我正在寻找使用information_schema的更清洁的实现

Col*_*ers 45

作为参考,这里是来自\ dT的SQL(pgAdmin使用相同或类似的)

SELECT      n.nspname as schema, t.typname as type 
FROM        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 NOT IN ('pg_catalog', 'information_schema')
Run Code Online (Sandbox Code Playgroud)

  • 此代码显示所有类型的列表,包括用户定义的枚举,但不提供它们如何定义的详细信息。 (3认同)

Gui*_*ido 20

这是列出当前数据库中所有枚举定义类型的简单方法.查询结果返回两列,第一列显示每个枚举类型的名称,第二列显示每个枚举类型的每个值的名称:

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


Vad*_*sov 14

列出所有数据库类型:

test=# \dT
             List of data types
 Schema |        Name         | Description
--------+---------------------+-------------
 public | gender              |
 public | status              |
Run Code Online (Sandbox Code Playgroud)

列出所有数据库类型以及值等附加信息:

test=# \dT+
                                                   List of data types
 Schema |        Name         |    Internal name    | Size |     Elements      | Owner | Access privileges | Description
--------+---------------------+---------------------+------+-------------------+-------+-------------------+-------------
 public | gender              | gender              | 4    | male             +| Vadim |                   |
        |                     |                     |      | female            |       |                   |
 public | status              | status              | 4    | processing       +| Vadim |                   |
        |                     |                     |      | passed           +|       |                   |
        |                     |                     |      | failed            |       |                   |
Run Code Online (Sandbox Code Playgroud)

获取具有附加信息的特定类型:

leps=# \dT+ gender
                                            List of data types
 Schema |  Name  | Internal name | Size | Elements | Owner | Access privileges | Description
--------+------------+---------------+------+-------------------+-------+-------------------+-------------
 public | gender | gender        | 4    | male    +| Vadim |                   |
        |        |               |      | female  +|       |                   |
Run Code Online (Sandbox Code Playgroud)


Pet*_*aut 9

枚举不在SQL标准中,因此不在信息模式中表示.其他用户定义的类型通常在视图中user_defined_types,但是没有实现.所以目前,您无法使用信息模式在PostgreSQL中列出用户定义的类型.

  • 请取消授予此答案并改为“列出所有数据库类型”`\dT` (11认同)

and*_*rew 8

由您的自我类型定义的所有列表:

\dT

testDB=> \dT
               List of data types
 Schema |          Name           | Description 
--------+-------------------------+-------------
 public | myType                  | 
(1 row)
Run Code Online (Sandbox Code Playgroud)


Mik*_*keM 5

我使用视图来显示我的枚举名称。因此,可以在应用程序中使用该视图中的数据为枚举字段提供可用选项列表。

CREATE OR REPLACE VIEW vw_enums AS
SELECT t.typname, e.enumlabel, e.enumsortorder
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid;
Run Code Online (Sandbox Code Playgroud)