Как перечислить пользовательские типы, используя 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;
Ответ 6
Посмотрите здесь: http://www.postgresql.org/docs/current/static/catalog-pg-enum.html
Каталог pg_enum должен иметь данные, которые вы ищете