【问题标题】:How to list custom types using Postgres information_schema如何使用 Postgres information_schema 列出自定义类型
【发布时间】:2020-01-14 00:30:24
【问题描述】:

我正在尝试使用 information_schema 查找 \dT 的等效 SQL,但似乎找不到任何东西。有这种事吗?

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

CREATE TYPE communication.channels AS ENUM
   ('text_message',
    'email',
    'phone_call',
    'broadcast');

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

【问题讨论】:

  • 如果你不想使用命令行,pgAdmin 可以这样做

标签: sql postgresql


【解决方案1】:

作为参考,这里是来自\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');

【讨论】:

  • 这段代码显示了所有类型的列表,包括用户定义的枚举,但没有给出它们是如何定义的细节。
【解决方案2】:

列出所有数据库类型:

test=# \dT
             List of data types
 Schema |        Name         | Description
--------+---------------------+-------------
 public | gender              |
 public | status              |

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

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            |       |                   |

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

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

【讨论】:

    【解决方案3】:

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

     SELECT pg_type.typname AS enumtype, 
         pg_enum.enumlabel AS enumlabel
     FROM pg_type 
     JOIN pg_enum 
         ON pg_enum.enumtypid = pg_type.oid;
    

    【讨论】:

    • AS enumlabel 部分是多余的,你不觉得吗?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      枚举不在 SQL 标准中,因此不在信息模式中表示。其他用户定义的类型通常会在视图user_defined_types 中,但这并没有实现。所以目前,你不能使用信息模式来列出 PostgreSQL 中的用户定义类型。

      【讨论】:

      • 请取消授予此答案并改为“列出所有数据库类型”\dT
      【解决方案6】:

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

      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;

      【讨论】:

        【解决方案7】:

        看看这里:http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

        pg_enum 目录应该有你正在寻找的数据

        【讨论】:

        • 不幸的是,pg_enum 目录只包含枚举标签,而不包含架构或其他任何内容。因此,无论如何您都必须进行连接才能获得有意义的数据
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多