Psql lista todas as tabelas

125

Gostaria de listar todas as tabelas no liferaybanco de dados na minha instalação do PostgreSQL. Como faço isso?

Eu gostaria de executar SELECT * FROM applications;no liferaybanco de dados. applicationsé uma tabela no meu liferay db. Como isso é feito?

Aqui está uma lista de todos os meus bancos de dados:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 
pethel
fonte

Respostas:

203

Se você deseja listar todas as tabelas, deve usar:

\dt *.*

para indicar que você deseja todas as tabelas em todos os esquemas . Isso incluirá tabelas pg_catalog, tabelas do sistema e tabelas information_schema. Não existe uma maneira integrada de dizer "todas as tabelas em todos os esquemas definidos pelo usuário"; No entanto, você pode definir sua search_pathlista de todos os esquemas de interesse antes de executar \dt.

Você pode fazer isso programaticamente, caso em que psqlos comandos de barra invertida não farão o trabalho. Este é o lugar onde oINFORMATION_SCHEMA vem para o resgate. Para listar tabelas:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

BTW, se você quiser ver o que psqlestá fazendo em resposta a um comando de barra invertida, execute psqlcom o -Esinalizador. por exemplo:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

para que você possa ver a psqlpesquisa pg_catalog.pg_databasequando obtém uma lista de bancos de dados. Da mesma forma, para tabelas em um determinado banco de dados:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

É preferível usar os INFORMATION_SCHEMAcatálogos padrão do SQL, portáteis, em vez dos Pg, sempre que possível, mas às vezes você precisa de informações específicas da Pg. Nesses casos, é bom consultar os catálogos do sistema diretamente e psql -Epode ser um guia útil sobre como fazê-lo.

Craig Ringer
fonte
information_schema.tablesinclui visualizações por algum motivo. (PostgreSQL 9.2, enfim.)
jpmc26
@ jpmc26 Sim, com table_type = 'VIEW', para que sejam fáceis de excluir. Em geral, o SQL tenta tratar as visualizações da mesma forma que as tabelas, tanto quanto possível.
Craig Ringer
94

Conecte-se ao banco de dados e liste as tabelas:

\c liferay
\dt

É assim que eu faço de qualquer maneira.

Você pode combinar esses dois comandos em uma única linha, se preferir:

\c liferay \dt
d11wtq
fonte
2
Você realmente deseja \dt *.*se nem todas as tabelas de interesse estiverem no search_path.
Craig Ringer
10

Para ver as tabelas públicas, você pode fazer

tabelas de lista

\dt

tabela de lista, visualização e privilégios de acesso

\dp or \z

ou apenas os nomes das tabelas

select table_name from information_schema.tables where table_schema = 'public';
nikkypx
fonte
2

Na consulta SQL, você pode escrever este código:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

Substitua seu esquema de tabela por YOUR_TABLE_SCHEME;

Exemplo:

select table_name from information_schema.tables where table_schema='eLearningProject';

Para ver todo o esquema e todas as tabelas, não há necessidade da cláusula where:

select table_name from information_schema.tables
Sevki Kocadag
fonte
1

Um exemplo de uma linha é

\dt schemaname.* 

no seu senario

\dt public.*
mcolak
fonte
0

Isso pode ser usado em scripts de automação se você não precisar de todas as tabelas em todos os esquemas:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done
danbst
fonte
-3

Você pode digitar \?para obter informações sobre todos os comandos suportados no psql.

Sunil Kumar
fonte