Home Articles

有没有办法显示用户定义的postgresql枚举类型定义?

Asked
Viewed 272 times
48

假设我们已经定义了一个postgresql类型:

CREATE TYPE my_type AS ENUM('foo', 'bar');

有没有办法在创建后显示类型定义?

我希望“\ d my_type”能够显示“ENUM('foo','bar')”,但它说:

Did not find any relation named "my_type"

pg_type表似乎没有提供足够的信息 .

4 Answers

  • 67

    它是你所追求的,但并没有将它作为“创建”声明 . 您对域使用\ dD .

    \dT+ action.action_status
                              List of data types
     Schema |         Name         | Internal name | Size | Elements | Description 
    --------+----------------------+---------------+------+----------+-------------
     action | action.action_status | action_status | 4    | pending +| 
            |                      |               |      | live    +| 
            |                      |               |      | done    +| 
            |                      |               |      | notdone  | 
    (1 row)
    
  • 61

    如果您只需要全名(类型名称和架构)以及所有 enum 标签的排序列表,此查询将执行以下操作:

    SELECT n.nspname AS "schema", t.typname
         , string_agg(e.enumlabel, '|' ORDER BY e.enumsortorder) AS enum_labels
    FROM   pg_catalog.pg_type t 
    JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
    JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid  
    WHERE  t.typname = 'my_enum_type'
    GROUP  BY 1,2;
    

    返回:

    schema | typname      | enum_labels
    --------+--------------+-------------
     public | my_enum_type | foo|bar
    

    string_agg() 需要Postgres 9.0或更高版本,旧版本替换为 array_agg() .


    要获取SQL CREATE 语句,可以使用 pg_dump 并查看转储文件 .

    或者,更实际地,使用pgAdmin,它为数据库中的任何对象显示反向工程SQL创建脚本 . 在 object browser 中选择它,其创建脚本显示在 SQL pane 中 . 甚至可以选择将脚本自动复制到 SQL editor 的新打开的窗口,您可以在其中编辑和执行它 .

  • 12
    SELECT t.typname
    FROM pg_class c JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_type t ON a.atttypid = t.oid
    WHERE c.relname = 'your_type';
    

    棘手的部分是,只需从这些视图中选择*,就不会在结果中获得OID .

  • 1

    检查一下:

    select enum_range(null::my_type)
    

    我认为这是一个更简单的解决方案:) .

Related