Як перерахувати всі стовпці для вказаної таблиці


292

Я шукаю точну інформацію в базі даних, про яку я не знаю.

Це сторонній продукт, вони повільно відповідають на деякі запитання, і я знаю, що дані лежать всередині цього db, тому я хочу трохи зайнятися ретро-інженерією.

Враховуючи одну таблицю, чи можливо мати список імен стовпців для цієї таблиці?

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


Який доступ у БД ви маєте?
dezso

@dezso, це на окремій машині, але я можу ввійти в нього та запустити командний рядок psql, з правами адміністратора
Stephane Rolland

6
Якщо я вас правильно розумію, ви після \dt[+] table_nameв psql.
dezso

1
ніпе. \ nt +, схоже, не відображає назву стовпців. воно лише додає поле "Опис".
Стефан Ролланд

12
але \ d + назва таблиці працює!
Стефан Ролланд

Відповіді:


344

Окрім \d+ <table_name>вже знайденого командного рядка , ви також можете використовувати Інформаційну схему для пошуку даних стовпців, використовуючи information_schema.columns:

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

Примітка. Згідно з наведеним вище прикладом, переконайтеся, що значення містяться в лапках.


2
У PSQL, використовувати \x onабо \pset expanded onзробити результати запиту лінійний (замість табличній) і , таким чином , легше читати stackoverflow.com/a/9605093/513397
anishpatel

4
У поточних версіях (спробував це в 9.6) ви можете зробити в psql, \d+ public.*щоб отримати опис (схему + indeces / fkeys / тригери) всіх ваших таблиць і поглядів у publicсхемі. Ми використовуємо це в нашому сценарії гака перед попередньою фіксацією, щоб відслідковувати git змін у БД, внесених кожним комітом.
Таліс К.

4
ВИБІРТЕ ім'я стовпця, щоб отримати лише ім'я стовпця
Андрій

82

Як доповнення до інших відповідей, навіть оператор SELECT, який не повертає жодних рядків, відкриє вам назви стовпців та код програми.

select *
from table_name
where false;

Дозволи можуть зігратись із будь-яким із цих підходів.


Я припускаю, що ви маєте на увазі передати цей SQL команді psql. Я пропоную використовувати у цьому випадку параметр --no-psqlrc, щоб уникнути несподіванок у висновку.
JohnMudd

За винятком прихованих стовпців, які потрібно було вказати для вибору (наприклад, pg_class.oid)
okutane

71

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

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

psql(власний інтерфейс командного рядка), звичайно, займає швидку смугу і безпосередньо запитує джерело. Якщо ви почнете psqlз параметра-E , відобразиться SQL за такими командами, як нахил нахилу \d. Або \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+

Якщо ви шукаєте типи стовпців у запиті, ви можете використовувати psqls\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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.