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

Estoy buscando un dato preciso en una base de datos de la que no tengo conocimiento.

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.

Dado 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 declaraciones, que enumera textualmente todas las columnas de las que se compone la tabla.

Comentarios

  • ¿Qué tipo de acceso tiene para la base de datos?
  • @dezso, está en una máquina separada, pero puedo iniciar sesión e iniciar la línea de comando psql, con derechos de administrador
  • Si lo entiendo correctamente, están después de \dt[+] table_name en psql.
  • nop. \ dt + doesn t parece mostrar explícitamente el nombre de las columnas. solo agrega un campo » Description «.
  • ¡pero \ d + nombre de tabla funciona!

Responder

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

Comentarios

  • En psql, use \x on o \pset expanded on para realizar la consulta resultados lineales (en lugar de tabulares) y, por lo tanto, más fáciles de leer stackoverflow.com/a/9605093/513397
  • En las versiones actuales (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 public esquema. Lo usamos en nuestro script de enlace previo a la confirmación para realizar un seguimiento en git de los cambios en la base de datos realizados por cada confirmación.
  • SELECT column_name para obtener solo el nombre de la columna

Respuesta

Como complemento a las otras respuestas, incluso una instrucció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.

Comentarios

  • 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.
  • Excepto por las columnas ocultas, que debían especificarse para ser seleccionadas (como pg_class.oid)

Respuesta

El esquema de información es la forma lenta y segura: está estandarizado y en gran parte portátil a otras bases de datos que lo soportan. Y seguirá funcionando en las versiones principales.

Sin embargo, vistas en el esquema de información a menudo se unen muchas tablas de catálogos del sistema para cumplir estrictamente formato estandarizado – muchos de los cuales son simplemente carga muerta la mayor parte del tiempo. Esto los hace lentos .
Los desarrolladores de Postgres no están haciendo promesas, sino conceptos básicos (como lo que se necesita aquí) no van 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 psql con el parámetro -E , el SQL detrás Se muestran los comandos de barra invertida como \d. O \set ECHO_HIDDEN on desde 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 esto? 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 consultar information_schema.columns . Prueba EXPLAIN ANALYZE para verlo 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:

Comentarios

  • Realmente me gusta que le muestre -E y le muestre a la gente cómo obtener el sql de psql.
  • Estoy de acuerdo.Ejecuté algunas pruebas de velocidad y el pg_catalog funciona más del doble de rápido

Respuesta

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) 

Respuesta

PostgreSQL solamente

Esto es algo cursi, pero podría ser un competidor 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 importe el pedido y tenga la extensión hstore instalada, puede hacerlo aún más corto

SELECT skeys(hstore(NULL::schema_name.table_name)) 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *