Как мне перечислить все столбцы для указанной таблицы

293

Я ищу точную информацию в базе данных, о которой я ничего не знаю.

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

Учитывая одну таблицу, возможно ли иметь список имен столбцов для этой таблицы?

Например, в SqlServer можно вывести таблицу в операторы многократного использования CREATE, которые содержат текстовые списки всех столбцов, из которых состоит таблица.

Стефан Роллан
источник
Какой у вас доступ к БД?
Дезсо
@dezso, это на отдельной машине, но я могу войти в нее и запустить командную строку psql с правами администратора
Стефан Роллан
6
Если я вас правильно понимаю, вы после \dt[+] table_nameв psql.
Дезсо
1
Нет. \ dt + явно не отображает имя столбца. он только добавляет поле «Описание».
Стефан Роллан
12
но \ d + имя таблицы работает!
Стефан Роллан

Ответы:

344

В дополнение к командной строке, которую \d+ <table_name>вы уже нашли, вы также можете использовать информационную схему для поиска данных столбца, используя information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

Примечание. В соответствии с приведенным выше примером убедитесь, что значения заключены в кавычки.

bhamby
источник
2
В psql используйте \x onили, \pset expanded onчтобы сделать результаты запроса линейными (а не табличными) и, таким образом, их проще читать stackoverflow.com/a/9605093/513397
anishpatel
4
В текущих версиях (пробовал в 9.6) вы можете сделать это в psql, \d+ public.*чтобы получить описание (schema + indeces / fkeys / triggers) всех ваших таблиц и представлений в publicсхеме. Мы используем его в нашем скрипте ловушки перед фиксацией, чтобы отслеживать изменения в БД, вносимые каждым коммитом.
Талис К.
4
ВЫБЕРИТЕ имя столбца, чтобы получить только имя столбца
Эндрю
83

В качестве дополнения к другим ответам даже оператор SELECT, который не возвращает строк, предоставит имена столбцов вам и коду приложения.

select *
from table_name
where false;

Разрешения могут вступать в игру с любым из этих подходов.

Майк Шеррилл 'Cat Recall'
источник
Я предполагаю, что вы хотите передать этот SQL команде psql. В этом случае я предлагаю использовать параметр --no-psqlrc, чтобы избежать неожиданностей в выводе.
JohnMudd
За исключением скрытых столбцов, которые нужно было указать для выбора (например, pg_class.oid)
okutane
Красиво и просто. Спасибо.
Тимкофу
71

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

Однако представления в информационной схеме часто объединяются во многих таблицах из системных каталогов, чтобы соответствовать строго стандартизированному формату - многие из которых в большинстве случаев являются просто бесполезным грузом. Это делает их медленными .
Разработчики Postgres не дают обещаний, но основы (например, то, что здесь необходимо) не изменятся в основных версиях.

psql(родной интерфейс командной строки), конечно, выбирает быструю полосу и напрямую запрашивает источник. Если вы начнете psqlс этого параметра-E , \dбудет отображаться SQL, стоящий за командами с обратной косой чертой . Или \set ECHO_HIDDEN onиз командной строки psql. Исходя из этого, вы можете построить ответ на свой вопрос.

Учитывая одну таблицу, возможно ли иметь список имен столбцов для этой таблицы.

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

Быстрее, чем запросыinformation_schema.columns . Попробуйте EXPLAIN ANALYZEубедиться в этом сами. По-прежнему вряд ли имеет значение для разового поиска. Но может иметь значение, если используется в запросе / функции, которая повторяется много раз.

Есть также тонкие различия в видимости. Детальное сравнение:

Эрвин Брандштеттер
источник
2
На самом деле так вы показываете -Eи показываете людям, как получить sql из psql.
Эван Кэрролл
6

psql на PostgreSQL 11+

Если вы ищете для типов столбцов в запросе, вы можете использовать psql«S\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
Эван Кэрролл
источник
0

Только PostgreSQL

Это несколько нелепо, но может быть претендентом, если вы ищете самый короткий возможный SQL:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

или даже короче (при условии, что в таблице есть хотя бы одна строка)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

Распечатка сохраняет порядок. Если вы не заботитесь о заказе и у вас hstoreустановлено расширение, вы можете сделать еще короче

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
источник