Si desea una lista de todos tablas, se debe utilizar:
\dt *.*
para indicar que desea todas las tablas en todos los esquemas. Esto incluirá tablas en pg_catalog
, las tablas del sistema y las de information_schema
. No hay una forma incorporada de decir "todas las tablas en todos los esquemas definidos por el usuario"; Sin embargo, puede establecer su search_path
en una lista de todos los esquemas de interés antes de ejecutar \dt
.
Es posible que desee hacer esto mediante programación, en cuyo caso psql
comandos de barra invertida no harán el trabajo. Aquí es donde el the INFORMATION_SCHEMA
viene al rescate. Para una lista de tablas:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
Por cierto, si alguna vez quiere ver lo que está haciendo psql
en respuesta a un comando de barra invertida, ejecute psql
con la bandera -E
. por ejemplo:
$ 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;
**************************
Así se puede ver que está en busca psql
pg_catalog.pg_database
cuando se obtiene una lista de bases de datos. Del mismo modo, para las tablas dentro de una base de datos dada:
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;
Es preferible utilizar el SQL estándar, portátil INFORMATION_SCHEMA
en lugar de los catálogos del sistema Pg cuando sea posible, pero a veces se necesita información específica Pg. En esos casos, está bien consultar el system catalogs directamente, y psql -E
puede ser una guía útil sobre cómo hacerlo.
¡Guau! Muchas gracias por su BTW. Eso es muy valioso. –
'information_schema.tables' incluye vistas por alguna razón. (En PostgreSQL 9.2, de todos modos.) – jpmc26
@ jpmc26 Sí, con 'table_type = 'VIEW'', por lo que son fáciles de excluir. En general, SQL intenta tratar las vistas de la misma manera que las tablas tanto como sea posible. –