Como listar todos os bancos de dados e tabelas usando o psql?


1171

Estou tentando aprender a administração do PostgreSQL e comecei a aprender como usar a psqlferramenta de linha de comando.

Quando efetuo login psql --username=postgres, como faço para listar todos os bancos de dados e tabelas?

Eu tentei \d, de dS+mas nada está listado. Eu criei dois bancos de dados e algumas tabelas com o pgAdmin III, então eu sei que eles devem estar listados.


1
Se você quiser acessá-lo através da linha de comando, executepsql -l
adriaan

Esse comentário deve ser definitivamente uma das principais respostas! Se você precisar de autenticação, também pode psql --username=postgres -l.
Ulysse BN

Respostas:


1544

Observe os seguintes comandos:

  • \listou \l: lista todos os bancos de dados
  • \dt: lista todas as tabelas no banco de dados atual

Você nunca verá tabelas em outros bancos de dados, essas tabelas não são visíveis. Você precisa se conectar ao banco de dados correto para ver suas tabelas (e outros objetos).

Para alternar bancos de dados:

\connect database_name ou \c database_name

Veja o manual sobre psql .


131
Você pode usar \c db_namepara se conectar a um determinado banco de dados.
eikes

17
\dtnão parece listar todas as tabelas no banco de dados atual (parece excluir aqueles que não são encontrados no search_path, pelo menos em 9.2)
Jack Douglas

22
\dt *.listará todas as tabelas em todos os esquemas, sem precisar modificar o caminho da pesquisa.
Danpelota

19
\ l + é o meu favorito - mostra também o uso do disco.
Lester Cheung

1
No Windows, posso listar os bancos de dados com este comando, psql -U username -lmas ele não funciona com a versão da barra.
NoNameProvided

350

Isso lista bancos de dados:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Isso lista tabelas no banco de dados atual

SELECT table_schema,table_name
FROM information_schema.tables
ORDER BY table_schema,table_name;

11
Você está certo, mas a pergunta era sobre os meta-comandos da ferramenta psql. \ dt é muito mais fácil do que digitar qualquer consulta.
Frank Heikens

19
Eu acho que essa é uma ótima resposta, pois pode ser executada a partir de uma linha de comando do Linux, em vez de precisar estar no interpretador psql, que às vezes trava para mim usando o ExtraPutty.
Amor e paz - Joe Codeswell 16/15

2
Também salvou o meu dia. Para o meu caso em particular, estou adicionando WHERE table_schema = 'public'porque quero descartar apenas tabelas personalizadas.
Renra 28/09

29
Se você iniciar o psql com o sinalizador -E, ele exibirá a consulta real quando você usar um meta-comando.
Deebster

Esta é uma boa resposta. Embora o OP quisesse as metacommands, eu estava pesquisando no Google e isso me levou a essa pergunta.
Jogue fora a conta

109

No Postgresql, esses comandos do terminal listam os bancos de dados disponíveis

el@defiant$ /bin/psql -h localhost --username=pgadmin --list

Ou o comando declarou mais simplesmente:

psql -U pgadmin -l

Esses comandos imprimem isso no terminal:

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 kurz_prod | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

Esses são os bancos de dados disponíveis.

No PSQL esses comandos listam as tabelas disponíveis

Você precisa especificar um banco de dados antes de poder listar as tabelas nesse banco de dados.

el@defiant$ psql -U pgadmin -d kurz_prod

Isso leva você a um terminal psql:

kurz_prod=#

Use o comando que \dsignifica mostrar todas as tabelas, visualizações e sequências

kurz_prod=# \d

Isso imprime:

           List of relations
Schema |  Name   |   Type   |  Owner
--------+---------+----------+---------
public | mytable | table    | pgadmin
public | testing | sequence | pgadmin
(2 rows)

Em seguida, para sair do terminal psql, digite \qe pressione enter. Ou Ctrl-Dfaz a mesma coisa. Estas são as tabelas nesse banco de dados.


4
\ d não lista apenas tabelas:\d[S+] list tables, views, and sequences
Jack Douglas

3
Para mim, esta é a resposta "correta" porque não exige que você já esteja conectado a um banco de dados existente.
aardvarkk

71

\ltambém é uma abreviação de \list. Existem alguns comandos slash, que você pode listar no psql usando \?.


35

Para obter mais informações sobre o banco de dados e a lista de tabelas, faça o seguinte:

\l+ listar bancos de dados

                                                                    List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pgbench    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 29 MB   | pg_default |
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 6073 kB | pg_default | default administrative connection database
 slonmaster | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1401 MB | movespace  |
 slonslave  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 32 MB   | pg_default |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5785 kB | pg_default | unmodifiable empty database
            |          |          |             |             | postgres=CTc/postgres |         |            |
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5985 kB | pg_default | default template for new databases
            |          |          |             |             | postgres=CTc/postgres |         |            |
 test       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 13 MB   | pg_default |
(7 rows)

e

\d+ para listar todas as tabelas no esquema search_path atual no banco de dados atual.

test=# \dn+ --list schemas
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         | 
schema1 | postgres | postgres=UC/postgres+| 
        |          | =UC/postgres         | 
(2 row)

test=# set search_path to schema1, public;
SET
test=# \d+
                                  List of relations
     Schema  |      Name       | Type  |    Owner     |    Size    | Description
    ---------+-----------------+-------+--------------+------------+-------------
     public  | all_units       | table | postgres     | 0 bytes    |
     public  | asset           | table | postgres     | 16 kB      |
     public  | asset_attribute | table | postgres     | 8192 bytes |
     public  | food            | table | postgres     | 48 kB      |
     public  | name_log        | table | postgres     | 8192 bytes |
     public  | outable         | table | ordinaryuser | 0 bytes    |
     public  | outable2        | table | ordinaryuser | 0 bytes    |
     public  | test            | table | postgres     | 16 kB      |
     public  | usr             | table | postgres     | 5008 kB    |
     schema1 | t1              | table | postgres     | 0 bytes    |
    (10 rows)

33

No pg_Admin, você pode simplesmente executar o seguinte em seu banco de dados atual e ele obterá todas as tabelas para o esquema especificado:

SELECT * 
FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema = 'public' 
ORDER BY table_type, table_name

Isso fornecerá uma lista de todas as tabelas permanentes (geralmente as tabelas que você está procurando). Você pode obter apenas os nomes das tabelas se alterar o *curinga para apenas os table_name. O público table_schemaé o esquema padrão para a maioria dos bancos de dados, a menos que seu administrador tenha configurado um novo esquema.


3
Embora isso seja verdade, trata-se de um cliente diferente do que o OP perguntou.
Dezső

Isso funcionou muito bem para mim e, embora meu caso de uso não fosse exatamente o que o OP solicitava, ele me ajudou a obter a lista de tabelas enquanto estava conectado via wrapper (em Julialang LibPQ.jl )
Vass

19

É possível que você tenha inserido as tabelas em um esquema que não esteja no seu caminho de pesquisa ou no padrão, ou seja, público e, portanto, as tabelas não serão exibidas usando \ dt. Se você usar um esquema chamado, digamos, dados, poderá corrigir isso executando,

alter database <databasename> set search_path=data, public;

Saia e entre novamente no psql e agora \ dt também mostrará as tabelas nos dados do esquema.


1
Bem, um simples set search_path=data, public;seria fazer o truque, também :)
Dezso

@dezso, isso faz a alteração permanentemente ou apenas nessa sessão do psql?
John

Err, eu não estava muito claro. Ele foi planejado em vez do ciclo de logout-login.
Dez14
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.