Есть ли способ показать пользовательское определение типа перечисления postgresql?
Скажем, мы определили тип 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, похоже, не дает достаточной информации.
Ответы
Ответ 1
Это вам нужно, но это не означает, что это выражение "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)
Ответ 2
Проверьте это:
select enum_range(null::my_type)
Я думаю, что это гораздо более простое решение:).
Ответ 3
Если вам просто нужно полное имя (имя типа и схема) и отсортированный список всех меток 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
, и его создание script отображается в SQL pane
. Существует даже возможность скопировать script в новое открытое окно SQL editor
автоматически, где вы можете редактировать и выполнять его.
Ответ 4
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.