¿Cómo enumero todas las columnas para una tabla específica?

293

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

Es un producto de terceros, tardan en responder algunas preguntas, y sé que los datos están dentro de esa base de datos, así 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 CREATEdeclaraciones reutilizables , que enumera textualmente todas las columnas de las que se compone la tabla.

Stephane Rolland
fuente
¿Qué tipo de acceso tiene al DB?
dezso
@dezso, está en una máquina separada, pero puedo iniciar sesión y ejecutar la línea de comando psql, con derechos de administrador
Stephane Rolland
66
Si he entendido bien, que está después \dt[+] table_nameen psql.
dezso
1
no. \ dt + no parece mostrar explícitamente el nombre de las columnas. solo agrega un campo "Descripción".
Stephane Rolland
12
pero \ d + nombre de la tabla funciona!
Stephane Rolland

Respuestas:

344

Además de la línea de comando \d+ <table_name>que ya encontró, también puede usar el Esquema de información 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: Según el ejemplo anterior, asegúrese de que los valores estén entre comillas.

bhamby
fuente
2
En psql, use \x ono \pset expanded onpara hacer que los resultados de la consulta sean lineales (en lugar de tabulares) y, por lo tanto, más fáciles de leer stackoverflow.com/a/9605093/513397
anishpatel
44
En las versiones actuales (lo probé en 9.6) puede hacer en psql \d+ public.*para obtener la descripción (esquema + indeces / fkeys / triggers) de todas sus tablas y vistas en el publicesquema. Lo usamos en nuestro script de enlace previo al compromiso para realizar un seguimiento de los cambios en la base de datos realizados por cada confirmación.
Thalis K.
44
SELECCIONE column_name para obtener solo el nombre de la columna
Andrew
83

Como complemento de las otras respuestas, incluso una instrucción SELECT que no devuelva 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.

Mike Sherrill 'Retiro del gato'
fuente
Supongo que quiere decir pasar este SQL al comando psql. Sugiero usar la opción --no-psqlrc en ese caso para evitar sorpresas en la salida.
JohnMudd
Excepto por las columnas ocultas, que tuvieron que especificarse para ser seleccionadas (como pg_class.oid)
okutane
Agradable y simple Gracias.
timkofu
71

El esquema de información es lento y seguro: está estandarizado y es en gran medida portátil a otras bases de datos que lo admiten. Y seguirá funcionando en las principales versiones.

Sin embargo, las vistas en el esquema de información a menudo se unen en muchas tablas de los catálogos del sistema para cumplir con un formato estrictamente estandarizado, muchas de las cuales son solo carga muerta la mayor parte del tiempo. Esto los hace lentos .
Los desarrolladores de Postgres no están haciendo promesas, pero lo básico (como lo que se necesita aquí) no va a cambiar en las versiones principales.

psql(la interfaz de línea de comandos nativa) toma el carril rápido, por supuesto, y consulta la fuente directamente. Si comienza psqlcon el parámetro-E , \dse muestra el SQL detrás de los comandos de barra diagonal inversa como . O \set ECHO_HIDDEN ondesde la línea de comando psql. A partir de ahí, puede crear una respuesta a su 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 consultarinformation_schema.columns . Intenta EXPLAIN ANALYZEverlo por ti mismo. Todavía apenas importa para una búsqueda única. Pero podría marcar la diferencia si se usa en una consulta / función que se repite muchas veces.

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

Erwin Brandstetter
fuente
2
Realmente así te muestras -Ey le muestras a la gente cómo obtener el sql de psql.
Evan Carroll
6

psql en PostgreSQL 11+

Si está buscando los tipos de columna en una consulta, puede usar psql's\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
Evan Carroll
fuente
0

PostgreSQL solamente

Esto es algo raro pero podría ser un candidato si está buscando el SQL más corto posible:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

o incluso más corto (suponiendo que haya al menos una fila presente en la tabla)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

El listado conserva el orden. En caso de que no le interese el pedido y tenga una hstoreextensión instalada, puede hacerlo aún más corto

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
fuente