Как перечислить пользовательские типы, используя Postgres information_schema

Я пытаюсь найти эквивалентный SQL из \dT с помощью information_schema и не могу найти ничего. Существует ли такая вещь?

Пример. Если я добавлю следующее перечисление пользовательского типа, как его увидеть в информационном_схеме?

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

ПРИМЕЧАНИЕ. У меня есть точный SQL, используемый с помощью \dT (извлеченный путем включения журнала), но я ищу специально для более чистой реализации, используя information_schema

Ответ 1

Перечисления не входят в стандарт SQL и поэтому не представлены в информационной схеме. Другие пользовательские типы обычно бывают в представлении user_defined_types, но это не реализовано. Поэтому на данный момент вы не можете использовать информационную схему для отображения пользовательских типов в PostgreSQL.

Ответ 2

Для справки, вот SQL from\dT (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')

Ответ 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;

Ответ 4

Список всех, определенных вашими типами:

\dT

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

Ответ 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;