Psql перераховує всі таблиці


125

Я хотів би перерахувати всі таблиці в liferayбазі даних в моїй установці PostgreSQL. Як це зробити?

Я хотів би виконати SELECT * FROM applications;в liferayбазі даних. applications- це таблиця в моєму житті db. Як це робиться?

Ось список усіх моїх баз даних:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

Відповіді:


203

Якщо ви хочете перерахувати всі таблиці, ви повинні використовувати:

\dt *.*

щоб вказати, що потрібно всі таблиці у всіх схемах . Сюди ввійдуть таблиці в pg_catalog, системні таблиці та таблиці в information_schema. Немає вбудованого способу сказати "всі таблиці у всіх визначених користувачем схемах"; проте ви можете встановити search_pathсписок усіх цікавих схем перед запуском \dt.

Можливо, ви хочете зробити це програмно, і в цьому випадку psqlкоманди зворотної косої риси не виконають завдання. Це де допомогу приходить. Щоб перерахувати таблиці:INFORMATION_SCHEMA

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

BTW, якщо ви хочете коли-небудь побачити, що psqlробиться у відповідь на команду зворотної косої риси, запустіть psqlз -Eпрапором. наприклад:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

тож ви бачите, що psqlшукає, pg_catalog.pg_databaseколи отримує список баз даних. Аналогічно для таблиць у певній базі даних:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

Дедалі краще використовувати портативний стандарт SQL INFORMATION_SCHEMAзамість системних каталогів Pg, де це можливо, але іноді потрібна інформація, що стосується Pg. У цих випадках добре запитувати системні каталоги безпосередньо, і це psql -Eможе бути корисним посібником, як це зробити.


information_schema.tablesвключає перегляди з якоїсь причини. (У будь-якому випадку у PostgreSQL 9.2.)
jpmc26

@ jpmc26 Так, з table_type = 'VIEW', тому їх легко виключити. Загалом SQL намагається якомога більше обробляти представлення даних, як і таблиці.
Крейг Рінгер

94

Підключіться до бази даних та перерахуйте таблиці:

\c liferay
\dt

Ось так я це все роблю.

Ви можете об'єднати ці дві команди в один рядок, якщо вам зручніше:

\c liferay \dt

2
Ви дійсно хочете, \dt *.*якщо не всі цікаві таблиці є на search_path.
Крейг Рінгер

10

Щоб побачити загальнодоступні таблиці, які ви можете зробити

список таблиць

\dt

таблиця списку, права перегляду та доступу

\dp or \z

або просто назви таблиць

select table_name from information_schema.tables where table_schema = 'public';

2

У SQL Query ви можете написати цей код:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

Замініть схему таблиці на YOUR_TABLE_SCHEME;

Приклад:

select table_name from information_schema.tables where table_schema='eLearningProject';

Щоб побачити всю схему та всі таблиці, не потрібно, де пункт:

select table_name from information_schema.tables

1

Прикладом є однорядковий

\dt schemaname.* 

у вашому сенаріо

\dt public.*

0

Це можна використовувати в сценаріях автоматизації, якщо вам не потрібні всі таблиці у всіх схемах:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

-3

Ви можете ввести, \?щоб отримати інформацію про всі команди, що підтримуються в psql.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.