Список таблиц в схеме PostgreSQL


330

Когда я делаю \dtв psql, я получаю только список таблиц в текущей схеме ( publicпо умолчанию).

Как я могу получить список всех таблиц во всех схемах или конкретной схеме?

Ответы:


506

Во всех схемах:

=> \dt *.*

В конкретной схеме:

=> \dt public.*

Можно использовать регулярные выражения с некоторыми ограничениями

\dt (public|s).(s|t)
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | s    | table | cpn
 public | t    | table | cpn
 s      | t    | table | cpn

Опытные пользователи могут использовать нотации регулярных выражений, такие как классы символов, например [0-9], чтобы соответствовать любой цифре. Все специальные символы регулярных выражений работают так, как указано в Разделе 9.7.3, за исключением того, .что они используются в качестве разделителя, как упомянуто выше, *который транслируется в нотацию регулярного выражения .*, ?которая транслируется .и $которая соответствует буквально. Вы можете эмулировать эти символы шаблона при необходимости, написав ?для ., (R+|)для R*или (R|)для R?. $не требуется в качестве символа регулярного выражения, поскольку шаблон должен соответствовать целому имени, в отличие от обычной интерпретации регулярных выражений (другими словами,$автоматически добавляется к вашему шаблону). Напишите *в начале и / или конце, если вы не хотите, чтобы шаблон был закреплен. Обратите внимание, что в двойных кавычках все специальные символы регулярных выражений теряют свое специальное значение и сопоставляются буквально. Кроме того, специальные символы регулярного выражения сопоставляются буквально в шаблонах имен операторов (т. Е. Аргумент \do).


6
Просто \dtэквивалентно \dt public.*, я прав?
Замороженное пламя

Как насчет, скажем, двух конкретных таблиц в конкретной схеме? Как \dt public.user_info, public.user_scope?
Джеймс М. Лей

Неважно, это проще сделать \dt public.a; \dt public.b;на одной линии.
Джеймс М. Лей

это как бы неявно .. Если \ dt дает только "публичные" таблицы, то с помощью регулярных выражений не следует ожидать ничего большего ...
mehmet

1
@FrozenFlame Это не так! По умолчанию он показывает все , что находится в вашей search_path, и что по умолчанию в "$user", public.*. Следовательно, set search_path=s; \dtсобирается перечислить все таблицы в схеме s.
Лукас Юрихич

258

Вы можете выбрать таблицы из information_schema

SELECT * FROM information_schema.tables 
WHERE table_schema = 'public'

7
очень полезно, если ваш интерфейс не поддерживает ярлыки. Спасибо.
Мэтт Баннер

1
Это также хорошо, потому что вы могли бы сделать что-то вроде select table_schema, table_name из information_schema.tables, где table_name наподобие '% what%'; если вам нужно знать, в какой схеме находится таблица. Не уверен, что вы можете сделать это с \ dt
Джош Браун,

2
Спасибо, это работает на Amazon Redshift, а \ dt (принятый ответ) - нет.
Carlos2W

2
Это наиболее полезный ответ. information_schema определена в стандартах SQL и доступна в большинстве баз данных, которые соответствуют
Davos

54

В качестве альтернативы information_schemaможно использовать pg_tables:

select * from pg_tables where schemaname='public';

3
обратите внимание, что если вы хотите, чтобы имя таблицы являлось результирующим запросом, то этоSELECT tablename FROM pg_tables WHERE schemaname = 'public';
Грант Хамфрис

Обнаружена проблема с правами доступа к information_schemaсписку элементов из publicсхемы, но pg_tablesметод работал хорошо. Большое спасибо!
Джон Кроуфорд

8

Для тех, кто сталкивается с этим в будущем:

Если вы хотите увидеть список отношений для нескольких схем:

$psql mydatabase
mydatabase=# SET search_path TO public, usa;   #schema examples
SET
mydatabase=# \dt
              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | counties        | table | postgres
 public | spatial_ref_sys | table | postgres
 public | states          | table | postgres
 public | us_cities       | table | postgres
 usa    | census2010      | table | postgres
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.