Listar tabelas em um esquema do PostgreSQL


329

Quando eu faço um \dtno psql, recebo apenas uma lista de tabelas no esquema atual ( publicpor padrão).

Como posso obter uma lista de todas as tabelas em todos os esquemas ou um esquema específico?

Respostas:


505

Em todos os esquemas:

=> \dt *.*

Em um esquema específico:

=> \dt public.*

É possível usar expressões regulares com algumas restrições

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

Usuários avançados podem usar notações de expressão regular, como classes de caracteres, por exemplo [0-9] para corresponder a qualquer dígito. Todos os caracteres especiais de expressão regular funcionam conforme especificado na Seção 9.7.3, exceto pelo .que é considerado como um separador, como mencionado acima, *que é traduzido para a notação de expressão regular e.* , ?que é traduzida para .e $que é correspondida literalmente. Você pode emular esses caracteres padrão quando necessário, escrevendo ?para ., (R+|)para R*ou (R|)para R?. $não é necessário como um caractere de expressão regular, pois o padrão deve corresponder ao nome inteiro, diferente da interpretação usual das expressões regulares (em outras palavras,$é automaticamente anexado ao seu padrão). Escreva *no início e / ou no final se não desejar que o padrão seja ancorado. Observe que, entre aspas duplas, todos os caracteres especiais de expressão regular perdem seus significados especiais e são correspondidos literalmente. Além disso, os caracteres especiais da expressão regular são correspondidos literalmente nos padrões de nome do operador (ou seja, o argumento de \do).


6
Simplesmente \dté equivalente a \dt public.*, estou certo?
Frozen Flame

Que tal, digamos, duas tabelas específicas em um esquema específico? Gosta \dt public.user_info, public.user_scope?
James M. Lay

Deixa pra lá, é mais fácil fazer \dt public.a; \dt public.b;em uma linha.
James M. Lay

é uma espécie de implícita .. Se \ dt dá somente tabelas "públicos", não se poderia esperar nada mais via expressões regulares ..
mehmet

1
@FrozenFlame Não é! Por padrão, ele mostra o que há no seu search_pathe é o padrão "$user", public.*. Consequentemente, set search_path=s; \dtlistará todas as tabelas no esquema s.
Lukas Juhrich 25/01

258

Você pode selecionar as tabelas de information_schema

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

7
muito útil se sua interface não suportar os atalhos. obrigado.
precisa saber é o seguinte

1
Isso também é bom porque você pode fazer algo como selecionar table_schema, table_name em information_schema.tables, em que table_name seja como '% Whatever%'; . Se você precisa saber qual esquema a tabela está localizada em Não tenho certeza que você pode fazer isso com \ dt
Josh Brown

2
Obrigado, ele funciona no Amazon Redshift e \ dt (resposta aceita) não.
Carlos2W

2
Essa é a resposta mais geralmente útil. information_schema está definido no SQL Standards, e disponível na maioria dos bancos de dados que estejam de acordo
Davos

54

Como alternativa information_schema, é possível usar pg_tables:

select * from pg_tables where schemaname='public';

3
nota que se você só quer o nome da tabela é a consulta resultante éSELECT tablename FROM pg_tables WHERE schemaname = 'public';
Grant Humphries

Foi encontrado um problema de permissão ao information_schemanão listar itens do publicesquema, mas o pg_tablesmétodo funcionou bem. Muito Obrigado!
John Crawford

8

Para aqueles que se depararem com isso no futuro:

Se você deseja ver uma lista de relações para vários esquemas:

$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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.