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

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

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


person Nyxynyx    schedule 26.03.2013    source источник


Ответы (5)


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

=> \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).

person Clodoaldo Neto    schedule 26.03.2013
comment
Просто \dt эквивалентно \dt public.*, я прав? - person Frozen Flame; 25.08.2015
comment
Как насчет, скажем, двух конкретных таблиц в определенной схеме? Нравится \dt public.user_info, public.user_scope? - person James M. Lay; 11.11.2015
comment
Неважно, проще сделать \dt public.a; \dt public.b; в одной строке. - person James M. Lay; 11.11.2015
comment
это как бы неявно .. Если \ dt дает только общедоступные таблицы, от регулярных выражений ожидать чего-либо большего не приходится .. - person mehmet; 19.09.2018
comment
И если имя вашей таблицы содержит заглавные буквы, вы должны указать имя схемы следующим образом \dt "MySchema".* - person Catfish; 20.05.2019
comment
@FrozenFlame Это не так! По умолчанию он показывает все, что находится в вашем search_path, а это по умолчанию "$user", public.*. Следовательно, set search_path=s; \dt будет перечислять все таблицы в схеме s. - person Lukas Juhrich; 25.01.2020

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

SELECT * FROM information_schema.tables 
WHERE table_schema = 'public'
person Jakub Kania    schedule 26.03.2013
comment
очень полезно, если ваш интерфейс не поддерживает ярлыки. Благодарю. - person Matt Bannert; 20.01.2014
comment
Это также хорошо, потому что вы можете сделать что-то вроде select table_schema, table_name из information_schema.tables, где table_name как '% Any%'; если вам нужно знать, в какой схеме находится таблица. Не уверен, что вы можете сделать это с помощью \ dt - person Josh Brown; 30.09.2015
comment
Спасибо, он работает на Amazon Redshift, а \ dt (принятый ответ) - нет. - person Carlos2W; 10.11.2015
comment
Это наиболее полезный ответ. information_schema определена в стандартах SQL и доступна в большинстве баз данных, которые соответствуют - person Davos; 10.11.2017
comment
Чтобы исключить просмотры, поместите AND table_type = 'BASE TABLE' в предложение where. - person SzieberthAdam; 14.07.2021

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

select * from pg_tables where schemaname='public';
person Radek Postołowicz    schedule 28.05.2015
comment
обратите внимание, что если вы хотите, чтобы имя таблицы было только результирующим запросом, это SELECT tablename FROM pg_tables WHERE schemaname = 'public'; - person Grant Humphries; 15.02.2016
comment
Обнаружена проблема с разрешениями, когда information_schema не перечисляет элементы из схемы public, но метод pg_tables работал нормально. Большое спасибо! - person John Crawford; 09.01.2018

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

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

$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
person Blee    schedule 01.02.2018

Если вас интересует перечисление всех таблиц в конкретной схеме, я нашел этот ответ релевантным:

SELECT table_schema||'.'||table_name AS full_rel_name
  FROM information_schema.tables
 WHERE table_schema = 'yourschemaname';
person linog    schedule 29.03.2021
comment
Чтобы исключить просмотры, поместите AND table_type = 'BASE TABLE' в предложение where. - person SzieberthAdam; 14.07.2021