Запросить сведения о схеме таблицы в PostgreSQL?

Мне нужно знать тип столбца в PostgreSQL (т.е. varchar(20)). Я знаю, что, вероятно, мог бы найти это, используя \d что-то в psql, но мне нужно, чтобы это было сделано с помощью запроса на выборку.
Возможно ли это в PostgreSQL?


person David    schedule 02.12.2010    source источник


Ответы (3)


Вы можете полностью описать таблицу с помощью postgres с помощью следующего запроса:

SELECT
  a.attname as Column,
  pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype
  FROM
  pg_catalog.pg_attribute a
  WHERE
    a.attnum > 0
  AND NOT a.attisdropped
  AND a.attrelid = (
    SELECT c.oid
    FROM pg_catalog.pg_class c
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE c.relname ~ '^(TABLENAME)$'
   AND pg_catalog.pg_table_is_visible(c.oid)
  )

Благодаря этому вы получите имена столбцов и тип данных.

Также можно запустить клиент psql, используя параметр -E.

$ psql -E

И тогда простой \d mytable выведет запросы, используемые postgres для описания таблицы. Это работает для каждой команды описания psql.

person Alexandre GUIDET    schedule 02.12.2010
comment
Отличный ответ! Однако я столкнулся с другой проблемой: stackoverflow.com/questions/4336465/ - person David; 02.12.2010
comment
Я не думаю, что вам нужно это регулярное выражение, c.relname ~ '^(TABLENAME)$' эквивалентно c.relname = 'TABLENAME'. Хороший ответ, хотя. - person mu is too short; 02.12.2010
comment
@mu Вы правы, но я полагаю, что он просто скопировал это из чего-то с поддержкой регулярных выражений :) - person Nick Barnes; 11.02.2014

В PostgreSQL есть гораздо более простой способ получить тип столбца.

SELECT pg_typeof(col)::text FROM tbl LIMIT 1

Разумеется, таблица должна содержать хотя бы одну строку. И вы получаете только базовый тип без модификаторов типа (если они есть). Используйте приведенную ниже альтернативу, если вам это тоже нужно.
Вы также можете использовать эту функцию для констант. руководство по pg_typeof().

Для пустой (или любой) таблицы вы можете использовать запрос к системному каталогу pg_attribute, чтобы получить полный список столбцов и их соответствующий тип по порядку:

SELECT attnum, attname AS column, format_type(atttypid, atttypmod) AS type
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytbl'::regclass   -- optionally schema-qualified
AND    NOT attisdropped
AND    attnum > 0
ORDER  BY attnum;

Руководство по format_type() и для типов идентификаторов объектов, таких как regclass.

person Erwin Brandstetter    schedule 26.10.2011
comment
Некоторое время ищу format_type(atttypid, atttypmod), так как кажется, что это то же самое, что и information_schema.columns.udt_name (или подобное, и это совершенно нормально для моего случая). Спасибо :). - person Dolfa; 19.04.2014

Да, взгляните на information_schema.

person Matt K    schedule 02.12.2010