¿Cómo enumero todos los esquemas en PostgreSQL?

239

Cuando uso PostgreSQL v9.1, ¿cómo enumero todos los esquemas que usan SQL?

Esperaba algo en la línea de:

SELECT something FROM pg_blah;
Stéphane
fuente

Respuestas:

259

Para enumerar todos los esquemas, use el estándar (ANSI) INFORMATION_SCHEMA

select schema_name
from information_schema.schemata;

Más detalles en el manual

alternativamente:

select nspname
from pg_catalog.pg_namespace;

Más detalles sobre pg_catalog en el manual

un caballo sin nombre
fuente
250

Al usar la psqllínea de comando, puede enumerar todos los esquemas con comando \dn.

eppesuig
fuente
Gracias. Sería bueno tener solo los esquemas devueltos por \ dn, pero en este caso estoy escribiendo una aplicación de arranque que se conecta usando libpq / libpqxx, por lo que no tengo acceso a la CLI.
Stéphane
1
¿Qué son los esquemas, que \dnenumeran, en oposición a las tablas que \dtenumeran?
Tommy
8
@Tommy \dtenumera las tablas para el esquema público. Para mostrar tablas de todos los esquemas de uso \dt *.*y para un uso de esquema particular \dt schema_name.*.
Serio
@Tommy, los esquemas son espacios de nombres: puede tener diferentes tablas con el mismo nombre en diferentes espacios de nombres.
eppesuig
38

Conéctese al comando psql -> psql --u {userName} {DBName}, luego puede escribir el siguiente comando para verificar cuántos esquemas están presentes en la base de datos

DBName=# \dn

De lo contrario, puede verificar la sintaxis siguiendo los pasos a continuación fácilmente:

  1. Después de conectar el DB, presione

    DBName=# help

Obtendrá las siguientes opciones:

Está utilizando psql, la interfaz de línea de comandos para PostgreSQL.
Escriba: \ copyright para los términos de distribución
\ h para obtener ayuda con los comandos SQL
\? para obtener ayuda con los comandos psql
\ g o terminar con punto y coma para ejecutar la consulta
\ q para salir

Entonces presione

DBName=# \?

Obtendrá todas las opciones muy fácilmente.

Bhabatosh Bera
fuente
9

Comenzando en postgres 9.3, un truco que puede usar en postgres para obtener el sql exacto del comando informativo (como \ d, \ du, \ dp, etc.) en psql es mediante el uso de una transacción. Así es como funciona el truco. Abra una sesión de postgres, luego escriba su comando:

begin;
\dn+

Mientras la transacción aún se está ejecutando, abra otra sesión de postgres y consulte pg_stat_activity para obtener el sql exacto.

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
fuente
12
No necesitas engañarlo; solo corre\set ECHO_HIDDEN on
Nick Barnes
8
o ejecutarlo comopsql -E
Evan Carroll