Есть ли способ показать пользовательское определение перечислимого типа postgresql? - PullRequest
58 голосов
/ 02 марта 2012

Допустим, мы определили тип postgresql:

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

Есть ли способ показать определение типа после создания?

Я ожидаю, что "\ d my_type" покажетme "ENUM ('foo', 'bar')", но там написано:

Did not find any relation named "my_type"

Таблица pg_type, похоже, не дает достаточно информации.

Ответы [ 4 ]

79 голосов
/ 02 марта 2012

Это \ dT, вы после, но это не дает это как "CREATE" утверждение. Вы используете \ 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)
76 голосов
/ 15 августа 2014

Проверьте это:

select enum_range(null::my_type)

Я думаю, что это гораздо более простое решение:).

12 голосов
/ 05 марта 2012

Если вам просто нужно полное имя (имя типа и схема) и отсортированный список всех 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, где вы можете отредактировать и выполнить его.

1 голос
/ 02 марта 2012
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 в результатах.

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