sql >> Base de Datos >  >> RDS >> PostgreSQL

Psql enumera todas las tablas

Si desea enumerar todos tablas, debe usar:

\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 integrada de decir "todas las tablas en todos los esquemas definidos por el usuario"; sin embargo, puede establecer su search_path a 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 los comandos de barra invertida no harán el trabajo. Aquí es donde el INFORMATION_SCHEMA viene al rescate. Para listar tablas:

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

Por cierto, si alguna vez quieres ver qué psql está haciendo en respuesta a un comando de barra invertida, ejecute psql con el -E bandera. 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;
**************************

para que puedas ver que psql está buscando pg_catalog.pg_database cuando obtiene una lista de bases de datos. De manera similar, para 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 INFORMATION_SCHEMA estándar de SQL portátil en lugar de los catálogos del sistema Pg cuando sea posible, pero a veces necesita información específica de Pg. En esos casos, está bien consultar los catálogos del sistema directamente y psql -E puede ser una guía útil sobre cómo hacerlo.