Psql список всех таблиц

125

Я хотел бы перечислить все таблицы в liferayбазе данных в моей установке PostgreSQL. Как я могу это сделать?

Я хочу выполнить SELECT * FROM applications;в liferayбазе данных. applicationsэто таблица в моем liferay 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=# 
pethel
источник

Ответы:

203

Если вы хотите перечислить все таблицы, вы должны использовать:

\dt *.*

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

Вы можете сделать это программно, и в этом случае psqlкоманды с обратной косой чертой не будут работать. Вот тут- то иINFORMATION_SCHEMA приходит на помощь. Чтобы перечислить таблицы:

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

Кстати, если вы когда-нибудь захотите увидеть, что 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 пытается обрабатывать представления так же, как таблицы, насколько это возможно.
Craig Ringer
94

Подключитесь к базе данных, затем перечислите таблицы:

\c liferay
\dt

Во всяком случае, я так делаю.

Вы можете объединить эти две команды в одну строку, если хотите:

\c liferay \dt
d11wtq
источник
2
Вы действительно хотите, \dt *.*чтобы не все интересующие таблицы были в каталоге search_path.
Craig Ringer
10

Чтобы увидеть общедоступные столы, вы можете сделать

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

\dt

таблица списка, просмотр и права доступа

\dp or \z

или просто имена таблиц

select table_name from information_schema.tables where table_schema = 'public';
nikkypx
источник
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';

Чтобы увидеть всю схему и все таблицы, нет необходимости в предложении where:

select table_name from information_schema.tables
Севки Коджадаг
источник
1

Однострочный пример:

\dt schemaname.* 

в твоем сенарио

\dt public.*
mcolak
источник
0

Это можно использовать в сценариях автоматизации, если вам не нужны все таблицы во всех схемах:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done
danbst
источник
-3

Вы можете ввести, \?чтобы получить информацию обо всех командах, поддерживаемых в psql.

Сунил Кумар
источник