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


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.