¿Cómo enumero todas las columnas para una tabla especificada?


158

Estoy buscando información precisa en una base de datos que no conozco.

Es un producto de terceros, son lentos para responder algunas preguntas, y sé que los datos se encuentran dentro de esa base de datos, por lo que quiero hacer un poco de ingeniería retro.

Dada una tabla, ¿es posible tener una lista de los nombres de las columnas para esta tabla?

Por ejemplo, en SqlServer, es posible volcar una tabla en un CREATE declaraciones reutilizables, que enumera textualmente todas las columnas de las que se compone la tabla.

  0

¿Qué tipo de acceso tiene a la base de datos? 13 ago. 122012-08-13 12:49:57

  0

@dezso, está en una máquina separada, pero puedo iniciar sesión en ella y lanzar la línea de comandos psql, con derechos de administrador 13 ago. 122012-08-13 12:54:37

+4

Si te entiendo correctamente, estás buscando '\ dt [+] table_name' en' psql'. 13 ago. 122012-08-13 13:03:09

+1

nop\ dt + no parece mostrar explícitamente el nombre de las columnas.sólo agrega un campo de "Descripción". 13 ago. 122012-08-13 13:16:51

+7

pero \ d + nombre de la tabla funciona! 13 ago. 122012-08-13 13:18:12

197

Además de la línea de comandos \d+ que ya encontró, también puede usar el Information Schema para buscar los datos de la columna, usando information_schema.columns :

SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
    AND table_name  = 'your_table'

Nota: De acuerdo con el ejemplo anterior, asegúrese de que los valores estén encerrados entre comillas.

  0

En psql, use '\ x on' o' \ pset expandido en' para hacer que los resultados de la consulta sean lineales (en lugar de tabulares) y, por lo tanto, más fáciles de leer https://stackoverflow.com/a/9605093/513397 07 sep. 172017-09-07 22:46:06

+1

En las versiones actuales (probado en 9.6), puede hacerlo en psql '\ d + public. *' Para obtener la descripción (esquema + indeces/fkeys/triggers) de todas sus tablas y vistas en el esquema 'public'.Lo usamos en nuestro script de enganche de pre-confirmación para mantener un registro de los cambios en la base de datos realizados por cada confirmación. 23 oct. 172017-10-23 18:30:47

+1

SELECCIONE nombre_columna para obtener solo el nombre de columna 22 feb. 182018-02-22 16:56:14


54

El information schema es una forma lenta y segura: está estandarizado y es en gran parte portátil a otras bases de datos que lo admiten.Y seguirá funcionando a través de las principales versiones.

Sin embargo,puntos de vistaen el esquema de información a menudo se unen en muchas tablas desde el system catalogs para cumplir con un formato estrictamente estandarizado, muchos de los cuales son solo carga muerta la mayor parte del tiempo.Esto los hacelento.
Los desarrolladores de Postgres no están haciendo promesas, pero los conceptos básicos (como lo que se necesita aquí) no van a cambiar en las versiones principales.

psql (la interfaz de línea de comando nativa) toma el carril rápido y consulta la fuente directamente.Si inicia psql with the parameter -E , se muestra el comando detrás de la barra diagonal inversa de SQL, como \d .O bien \set ECHO_HIDDEN on desde la línea de comandos psql.A partir de ahí puedes construir una respuesta a tu pregunta.

Dada una tabla, es posible tener una lista de los nombres de las columnas para esta tabla.

SELECT attrelid::regclass AS tbl
      , attname      AS col
      , atttypid::regtype AS datatype
       -- more attributes?
FROM  pg_attribute
WHERE attrelid = 'myschema.mytable'::regclass -- table name, optionally schema-qualified
AND  attnum > 0
AND  NOT attisdropped
ORDER BY attnum;

Más rápido que querying information_schema.columns .Intente EXPLAIN ANALYZE para ver por sí mismo.Todavía no importa para una consulta de una sola vez.Pero podría marcar la diferencia si se utiliza en una consulta/función que se repite muchas veces.

También hay diferencias sutiles en la visibilidad.Comparación detallada:

+1

Realmente me gusta que muestres '-E' y le muestres a la gente cómo obtener el sql de psql. 02 dic. 162016-12-02 20:31:40


52

Como complemento de las otras respuestas, incluso una declaración SELECT que no devuelve filas expondrá los nombres de las columnas a usted y al código de la aplicación.

select *
from table_name
where false;

Los permisos pueden entrar en juego con cualquiera de estos enfoques.

  0

Rapido y Facil.La mejor respuesta si solo necesito ver una lista de columnas. 26 ene. 172017-01-26 18:23:54

  0

Supongo que quiere pasar este SQL al comando psql.Sugiero usar la opción --no-psqlrc en ese caso para evitar sorpresas en la salida. 09 mar. 172017-03-09 19:37:28

  0

Mejor, rápido y fácil. 04 dic. 172017-12-04 10:31:13

  0

¡Esto es genio! 01 feb. 182018-02-01 10:07:26