Como listar todos os esquemas no PostgreSQL?

239

Ao usar o PostgreSQL v9.1, como listar todos os esquemas usando o SQL?

Eu estava esperando algo do tipo:

SELECT something FROM pg_blah;
Stéphane
fonte

Respostas:

259

Para listar todos os esquemas, use o padrão (ANSI) INFORMATION_SCHEMA

select schema_name
from information_schema.schemata;

Mais detalhes no manual

alternativamente:

select nspname
from pg_catalog.pg_namespace;

Mais detalhes sobre pg_catalog no manual

um cavalo sem nome
fonte
250

Ao usar a psqllinha de comando, você pode listar todos esquema com comando \dn.

eppesuig
fonte
Obrigado. Seria bom ter apenas os esquemas retornados por \ dn, mas, neste caso, estou escrevendo um aplicativo de inicialização que se conecta usando libpq / libpqxx, para não ter acesso à CLI.
31513 Stéphane
1
o que são esquemas, \dnlistas, em oposição a tabelas que \dtlistam?
Tommy
8
@ Tommy \dtlista tabelas para esquema público. Para mostrar tabelas de todos os esquemas, use \dt *.*e para um esquema específico \dt schema_name.*.
Sério
@ Tommy, esquemas são namespaces: você pode ter tabelas diferentes com o mesmo nome em namespaces diferentes.
eppesuig
38

Conecte-se ao comando psql -> psql --u {userName} {DBName} e digite o comando abaixo para verificar quantos esquemas estão presentes no banco de dados

DBName=# \dn

Caso contrário, você pode verificar a sintaxe seguindo as etapas abaixo facilmente:

  1. Após conectar o DB, pressione

    DBName=# help

Você obterá as opções abaixo:

Você está usando o psql, a interface da linha de comandos para o PostgreSQL.
Digite: \ copyright para termos de distribuição
\ h para obter ajuda com comandos SQL
\? para obter ajuda com os comandos psql
\ g ou finalizar com ponto e vírgula para executar a consulta
\ q para sair

Então aperte

DBName=# \?

Você receberá todas as opções com muita facilidade.

Bhabatosh Bera
fonte
9

Começando No postgres 9.3, um truque que você pode usar no postgres para obter o sql exato do comando informativo (como \ d, \ du, \ dp, etc) no psql é usando uma transação. Aqui está como o truque vai. Abra uma sessão do postgres e digite seu comando:

begin;
\dn+

Enquanto a transação ainda estiver em execução, abra outra sessão do postgres e consulte pg_stat_activity para obter o sql exato.

postgres=# select query from pg_stat_activity ;
                                 query                                 
-----------------------------------------------------------------------
 SELECT n.nspname AS "Name",                                          +
   pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner",                 +
   pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges",+
   pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" +
 FROM pg_catalog.pg_namespace n                                       +
 WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'      +
 ORDER BY 1;
Soni Harriz
fonte
12
Você não precisa enganá-lo; apenas corra #\set ECHO_HIDDEN on
1111 Nick Barnes
8
ou execute-o comopsql -E
Evan Carroll