Как составить список пользовательских типов, используя Postgres information_schema - PullRequest
34 голосов
/ 07 сентября 2010

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

Пример: если я добавлю следующий пользовательский тип enum, как я могу увидеть его в information_schema?

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

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

Ответы [ 7 ]

43 голосов
/ 13 сентября 2010

Для справки, вот SQL из \ 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')
18 голосов
/ 15 августа 2012

Это простой способ перечислить все перечисленные типы в текущей базе данных.Результат запроса возвращает два столбца, первый показывает имя каждого типа перечисления, второй показывает имя каждого значения для каждого типа перечисления:

 SELECT pg_type.typname AS enumtype, 
     pg_enum.enumlabel AS enumlabel
 FROM pg_type 
 JOIN pg_enum 
     ON pg_enum.enumtypid = pg_type.oid;
9 голосов
/ 07 апреля 2018

Список всех типов БД:

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  +|       |                   |
8 голосов
/ 23 февраля 2014

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

\dT

testDB=> \dT
               List of data types
 Schema |          Name           | Description 
--------+-------------------------+-------------
 public | myType                  | 
(1 row)
8 голосов
/ 06 июня 2011

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

3 голосов
/ 05 апреля 2013

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

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;
0 голосов
/ 08 сентября 2010

Посмотрите здесь: http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

В каталоге pg_enum должны быть данные, которые вы ищете для

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...