¿Cómo enumero todas las bases de datos y tablas usando psql?

1171

Estoy tratando de aprender la administración de PostgreSQL y he comenzado a aprender a usar la psqlherramienta de línea de comandos.

Cuando inicio sesión psql --username=postgres, ¿cómo enumero todas las bases de datos y tablas?

He tratado \d, dy dS+pero nada aparece en la lista. He creado dos bases de datos y algunas tablas con pgAdmin III, por lo que sé que deberían aparecer en la lista.

Jonas
fuente
1
Si desea acceder a través de la línea de comando, ejecutepsql -l
adriaan el
¡Este comentario definitivamente debería ser una de las mejores respuestas! Si necesita autenticación, también puede hacerlo psql --username=postgres -l.
Ulysse BN

Respuestas:

1544

Tenga en cuenta los siguientes comandos:

  • \listo \l: enumerar todas las bases de datos
  • \dt: enumera todas las tablas en la base de datos actual

Nunca verá tablas en otras bases de datos, estas tablas no son visibles. Debe conectarse a la base de datos correcta para ver sus tablas (y otros objetos).

Para cambiar las bases de datos:

\connect database_name o \c database_name

Consulte el manual sobre psql .

Frank Heikens
fuente
131
Puede usar \c db_namepara conectarse a una determinada base de datos.
Eikes
17
\dtno parece enumerar todas las tablas en la base de datos actual (parece excluir aquellas que no se encuentran search_pathal menos en 9.2)
Jack Douglas
22
\dt *.enumerará todas las tablas en todos los esquemas, sin tener que modificar su ruta de búsqueda.
danpelota
19
\ l + es mi favorito: también muestra el uso del disco.
Lester Cheung
1
En Windows, puedo enumerar las bases de datos con este comando, psql -U username -lpero no funciona con la versión de barra diagonal.
NoNameProvided
350

Esto enumera las bases de datos:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Esto enumera las tablas en la base de datos actual

SELECT table_schema,table_name
FROM information_schema.tables
ORDER BY table_schema,table_name;
RolandoMySQLDBA
fuente
11
Tienes razón, pero la pregunta era sobre los metacomandos de la herramienta psql. \ dt es mucho más fácil que escribir cualquier consulta.
Frank Heikens
19
Creo que esta es una GRAN respuesta porque se puede ejecutar desde una línea de comandos de Linux en lugar de tener que estar en el intérprete psql que a veces me cuelga usando ExtraPutty.
Amor y paz - Joe Codeswell
2
También me salvó el día. Para mi caso particular, estoy agregando WHERE table_schema = 'public'porque quiero soltar solo tablas personalizadas.
Renra
29
Si inicia psql con el indicador -E, mostrará la consulta real cuando utilice un metacomando.
Deebster
Esta es una buena respuesta. Aunque OP quería los metacomandos, estaba buscando en Google para esto, y me llevó a esta pregunta.
Deseche la cuenta el
109

En Postgresql, estos comandos de terminal enumeran las bases de datos disponibles

el@defiant$ /bin/psql -h localhost --username=pgadmin --list

O el comando declaró más simplemente:

psql -U pgadmin -l

Esos comandos imprimen esto en la terminal:

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 kurz_prod | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

Estas son las bases de datos disponibles.

En PSQL, estos comandos enumeran las tablas disponibles.

Debe especificar una base de datos antes de poder enumerar las tablas en esa base de datos.

el@defiant$ psql -U pgadmin -d kurz_prod

Esto te lleva a un terminal psql:

kurz_prod=#

Utilice el comando que \dsignifica mostrar todas las tablas, vistas y secuencias

kurz_prod=# \d

Esto imprime:

           List of relations
Schema |  Name   |   Type   |  Owner
--------+---------+----------+---------
public | mytable | table    | pgadmin
public | testing | sequence | pgadmin
(2 rows)

Luego, para salir del terminal psql, escriba \qy presione Intro. O Ctrl-Dhace lo mismo. Estas son las tablas en esa base de datos.

Eric Leschinski
fuente
44
\ d no solo enumera las tablas:\d[S+] list tables, views, and sequences
Jack Douglas
3
Para mí, esta es la respuesta "correcta" porque no requiere que ya estés conectado a una base de datos existente.
aardvarkk
71

\lTambién es la abreviatura de \list. Hay bastantes comandos de barra, que puede enumerar en psql utilizando \?.

Derek Arnold
fuente
35

Para obtener más información sobre la base de datos y la lista de tablas, puede hacer lo siguiente:

\l+ para enumerar bases de datos

                                                                    List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pgbench    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 29 MB   | pg_default |
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 6073 kB | pg_default | default administrative connection database
 slonmaster | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1401 MB | movespace  |
 slonslave  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 32 MB   | pg_default |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5785 kB | pg_default | unmodifiable empty database
            |          |          |             |             | postgres=CTc/postgres |         |            |
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5985 kB | pg_default | default template for new databases
            |          |          |             |             | postgres=CTc/postgres |         |            |
 test       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 13 MB   | pg_default |
(7 rows)

y

\d+ para enumerar todas las tablas en el esquema actual de search_path en la base de datos actual

test=# \dn+ --list schemas
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         | 
schema1 | postgres | postgres=UC/postgres+| 
        |          | =UC/postgres         | 
(2 row)

test=# set search_path to schema1, public;
SET
test=# \d+
                                  List of relations
     Schema  |      Name       | Type  |    Owner     |    Size    | Description
    ---------+-----------------+-------+--------------+------------+-------------
     public  | all_units       | table | postgres     | 0 bytes    |
     public  | asset           | table | postgres     | 16 kB      |
     public  | asset_attribute | table | postgres     | 8192 bytes |
     public  | food            | table | postgres     | 48 kB      |
     public  | name_log        | table | postgres     | 8192 bytes |
     public  | outable         | table | ordinaryuser | 0 bytes    |
     public  | outable2        | table | ordinaryuser | 0 bytes    |
     public  | test            | table | postgres     | 16 kB      |
     public  | usr             | table | postgres     | 5008 kB    |
     schema1 | t1              | table | postgres     | 0 bytes    |
    (10 rows)
Soni Harriz
fuente
33

Desde pg_Admin simplemente puede ejecutar lo siguiente en su base de datos actual y obtendrá todas las tablas para el esquema especificado:

SELECT * 
FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema = 'public' 
ORDER BY table_type, table_name

Esto le dará una lista de todas las tablas permanentes (generalmente las tablas que está buscando). Puede obtener solo los nombres de las tablas si cambia el *comodín a solo el table_name. El público table_schemaes el esquema predeterminado para la mayoría de las bases de datos a menos que su administrador haya configurado un nuevo esquema.

Larry W
fuente
3
Si bien esto es cierto, se dirige a un cliente diferente al que le preguntó el OP.
dezso
Esto funcionó muy bien para mí, y aunque mi caso de uso no era exactamente lo que pedía el OP, me ayudó a obtener la lista de la tabla mientras estaba conectado a través de un contenedor (en Julialang LibPQ.jl )
Vass
19

Es posible que haya insertado las tablas en un esquema que no está en su ruta de búsqueda, o la predeterminada, es decir, pública, por lo que las tablas no aparecerán usando \ dt. Si usa un esquema llamado, digamos, datos, puede solucionarlo ejecutando,

alter database <databasename> set search_path=data, public;

Salga y vuelva a ingresar psql y ahora \ dt también le mostrará las tablas en los datos del esquema.

John Powell
fuente
1
Bueno, un simple set search_path=data, public;haría el truco también :)
dezso
@dezso, ¿eso hace el cambio de forma permanente, o solo en esa sesión de psql?
John Powell
Err, no estaba muy claro. Fue pensado en lugar del ciclo de cierre de sesión.
dezso