Estou tentando aprender a administrar PostgreSQL e comecei a aprender a usar a psql
ferramenta de linha de comando.
Quando faço login com psql --username=postgres
, como faço para listar todos os bancos de dados e tabelas?
Eu tentei \d
, d
e dS+
mas nada está listado. Eu criei dois bancos de dados e algumas tabelas com pgAdmin III, então sei que eles devem ser listados.
Comentários
Resposta
Observe os seguintes comandos:
-
\list
ou\l
: lista todos os bancos de dados -
\dt
: liste todas as tabelas no banco de dados atual usando seusearch_path
-
\dt *.
: liste todas as tabelas no banco de dados atual, independentemente de seusearch_path
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 os bancos de dados:
\connect database_name
ou \c database_name
Consulte o manual sobre psql .
Comentários
- Você pode usar
\c db_name
para se conectar a um determinado banco de dados. -
\dt
não ‘ t parecem listar todas as tabelas no banco de dados atual (parece excluir aquelas que não estão ‘ encontradas nosearch_path
pelo menos em 9.2) -
\dt *.
irá listar todas as tabelas em todos os esquemas, sem ter que modificar seu caminho de pesquisa. - \ l + is meu favorito – mostra o uso do disco também.
- No Windows, posso listar os bancos de dados com este comando
psql -U username -l
, mas não funciona com a versão slash.
Resposta
Lista os bancos de dados:
SELECT datname FROM pg_database WHERE datistemplate = false;
Isso lista as tabelas no banco de dados atual
SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;
Comentários
- Você ‘ está certo, mas a questão era sobre os meta-comandos da ferramenta psql. \ dt é muito mais fácil do que digitar qualquer consulta.
- Acho que esta é uma ótima resposta porque pode ser executado a partir de uma linha de comando do Linux em vez de precisar estar no interpretador psql, que às vezes trava para mim usando ExtraPutty.
- Também salvou meu dia. Para meu caso específico, ‘ estou adicionando
WHERE table_schema = 'public'
porque quero descartar apenas tabelas personalizadas. - Se você começar psql com o sinalizador -E, ele exibirá a consulta real quando você usar um meta-comando.
- Sim, acho que ‘ é uma boa resposta, pois permite juntar e consultar os bancos de dados de uma forma mais controlada, especialmente quando você deseja gerar algum script de uma grande lista de banco de dados. Obrigado.
Resposta
No Postgresql, esses comandos de terminal listam os bancos de dados disponíveis
el@defiant$ /bin/psql -h localhost --username=pgadmin --list
Ou o comando declarado de forma mais simples:
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)
Estes são os bancos de dados disponíveis.
No PSQL, esses comandos listam as tabelas disponíveis
Você deve especificar um banco de dados antes de pode 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 \d
que significa 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)
Então, para sair do terminal psql, digite \q
e pressione enter. Ou Ctrl-D
faz a mesma coisa. Estas são as tabelas desse banco de dados.
Comentários
- \ d não lista apenas as tabelas:
\d[S+] list tables, views, and sequences
- Para mim, esta é a resposta ” correta ” porque não ‘ t exigem que você já esteja conectado a um banco de dados existente.
- Um liner para uso em scripts (como root):
su - -c 'psql -U postgres postgres -P pager=off -P tuples_only=on -l' postgres | cut -d'|' -f1 | tr -d '[:blank:]' | grep -vE '$^'
Resposta
\l
também é uma abreviação de \list
. Existem alguns comandos de barra, que você pode listar no psql usando \?
.
Resposta
Para obter mais informações sobre o banco de dados e a lista de tabelas, você pode fazer:
\l+
para 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)
Resposta
A partir do 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 o levará 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 table_name
. O table_schema
público é o esquema padrão para a maioria dos bancos de dados, a menos que seu administrador tenha configurado um novo esquema.
Comentários
- Embora seja verdade, trata-se de um cliente diferente do que o OP perguntou.
- Isso funcionou muito bem para mim e, embora meu caso de uso não fosse exatamente o que o OP pediu, ele me ajudou a obter a lista de tabelas enquanto conectado via wrapper (em Julialang LibPQ.jl )
Resposta
É possível que você tenha inserido as tabelas em um esquema que não está em seu caminho de busca, ou o padrão, ou seja, público e assim as tabelas não aparecerão usando \ dt. Se você usar um esquema chamado, digamos, dados, você pode 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.
Comentários
- Bem, um simples
set search_path=data, public;
faria o truque também 🙂 - @dezso, isso faz a mudança permanentemente ou apenas naquela sessão do psql?
- Err, não fui muito claro. Foi planejado em vez do ciclo logout-login.
psql -l
psql --username=postgres -l
.