Как найти информацию об атрибутах пользовательских типов в Postgres? - PullRequest
0 голосов
/ 08 февраля 2012

Учтите, что у меня есть определенный пользователем тип следующим образом:

CREATE TYPE mytype AS
 (myvar character(1),
  myvar2 bit(10));

Могу ли я использовать любую из информационных таблиц Postgres для получения информации об атрибутах для этого типа:

Т.е.«Mytype», информация, которую я хочу получить:

  • myvar : character(1)
  • myvar2 : bit(10)

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Да, в таблице pg_type будет заполнен столбец typrelid. Это ключ OID для таблицы pg_class, который затем используется в таблицах pg_attribute, как и в случае таблиц, представлений, индексов и т. Д.

select attname, format_type(atttypid, atttypmod)
from pg_type
     join pg_class on pg_class.oid = pg_type.typrelid
     join pg_attribute on pg_attribute.attrelid = pg_class.oid
where typname = 'mytype'
order by attnum
0 голосов
/ 06 июня 2018

В дополнение к ответу https://stackoverflow.com/a/9195771/6178141 Я хотел бы добавить несколько комментариев.

Здесь нужно рассмотреть пару вещей.

1) Там могут быть удалены атрибуты. Да, можно изменить существующий тип и добавить и / или удалить атрибуты. Удаленные атрибуты помечаются как TRUE в столбце attisdropped, но они принимают номер атрибута. Например, если мы выполним следующие операторы в дополнение к DTL выше:

 ALTER TYPE mytype ADD ATTRIBUTE abc double precision;
 ALTER TYPE mytype DROP ATTRIBUTE myvar2;

, тогда атрибут abc будет иметь физический номер 2, а значение attnum будет равно 3.

Итак, нам нужно добавить это условие в предложение WHERE:

AND NOT attisdropped

2) Также необходимо учесть схему типа. mytype будет работать для public схемы. Если тип создается в другой схеме, он не будет работать. В этом случае я лично больше предпочитаю следующее условие:

WHERE attrelid = 'myschema.mytype'::regclass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...