Come posso elencare tutte le colonne per una tabella specificata


293

Sto cercando un'informazione precisa in un database di cui non sono a conoscenza.

È un prodotto di terze parti, sono lenti a rispondere ad alcune domande e so che i dati si trovano all'interno di quel db, quindi voglio fare un po 'di ingegneria retrò.

Data una tabella, è possibile avere un elenco dei nomi delle colonne per questa tabella?

Ad esempio in SqlServer, è possibile scaricare una tabella in CREATEistruzioni riutilizzabili , che elenca testualmente tutte le colonne di cui è composta la tabella.


Che tipo di accesso hai al DB?
dezso,

@dezso, è su una macchina separata, ma posso accedervi e avviare la riga di comando di psql, con diritti di amministratore
Stephane Rolland,

6
Se ho capito bene, siete dopo \dt[+] table_namea psql.
dezso,

1
no. \ dt + non sembra mostrare esplicitamente il nome delle colonne. aggiunge solo un campo "Descrizione".
Stephane Rolland,

12
ma \ d + nome tabella funziona!
Stephane Rolland,

Risposte:


344

Oltre alla riga di comando che \d+ <table_name>hai già trovato, puoi anche utilizzare lo schema delle informazioni per cercare i dati della colonna, usando information_schema.columns:

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

Nota: come nell'esempio sopra, assicurarsi che i valori siano racchiusi tra virgolette.


2
In psql, utilizzare \x ono \pset expanded onper rendere i risultati della query lineare (anziché tabellare) e quindi più facile da leggere stackoverflow.com/a/9605093/513397
anishpatel

4
Nelle versioni correnti (provato in 9.6) puoi fare in psql \d+ public.*per ottenere la descrizione (schema + indeces / fkeys / trigger) di tutte le tue tabelle e viste nello publicschema. Lo usiamo nel nostro script hook pre-commit per tenere traccia delle modifiche apportate al DB da ciascun commit.
Thalis K.,

4
SELEZIONA nome_colonna per ottenere solo il nome colonna
Andrew

83

In aggiunta alle altre risposte, anche un'istruzione SELECT che non restituisce righe esporrà i nomi delle colonne a te e al codice dell'applicazione.

select *
from table_name
where false;

Le autorizzazioni potrebbero entrare in gioco con uno di questi approcci.


Presumo che intendi passare questo SQL al comando psql. Suggerisco di usare l'opzione --no-psqlrc in quel caso per evitare sorprese nell'output.
JohnMudd,

Ad eccezione delle colonne nascoste, che dovevano essere specificate per essere selezionate (come pg_class.oid)
okutane,

Bello e semplice. Grazie.
timkofu

71

Lo schema delle informazioni è lento e sicuro: è standardizzato e ampiamente portabile su altri database che lo supportano. E continuerà a funzionare tra le versioni principali.

Tuttavia, le viste nello schema informativo spesso si uniscono in molte tabelle dei cataloghi di sistema per soddisfare un formato rigorosamente standardizzato, molte delle quali sono solo merci morte per la maggior parte del tempo. Questo li rende lenti .
Gli sviluppatori di Postgres non stanno promettendo, ma le basi (come ciò che è necessario qui) non cambieranno nelle versioni principali.

psql(l'interfaccia della riga di comando nativa) prende la corsia di sorpasso, ovviamente, e interroga direttamente l'origine. Se si inizia psqlcon il parametro-E , \dviene visualizzato l'SQL dietro i comandi backslash come . O \set ECHO_HIDDEN ondalla riga di comando di psql. A partire da lì puoi costruire una risposta alla tua domanda.

Data una tabella, è possibile avere un elenco dei nomi delle colonne per questa tabella.

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;

Più veloce di interrogareinformation_schema.columns . Prova EXPLAIN ANALYZEa vedere di persona. Difficilmente conta ancora una volta una ricerca. Ma potrebbe fare la differenza se utilizzato in una query / funzione che si ripete più volte.

Ci sono anche sottili differenze di visibilità. Confronto dettagliato:


2
Mi piace davvero che ti mostri -Ee mostri alle persone come ottenere il sql di psql.
Evan Carroll,

6

psql su PostgreSQL 11+

Se stai cercando i tipi di colonna in una query, puoi usare quelli psqldi\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)

0

Solo PostgreSQL

Questo è un po 'complicato, ma potrebbe essere un contendente se stai cercando l'SQL più breve possibile:

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

o anche più breve (supponendo che nella tabella sia presente almeno una riga)

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

L'elenco conserva l'ordine. Nel caso in cui non ti interessi all'ordine e che l' hstoreestensione sia installata, puoi farlo anche più breve

SELECT skeys(hstore(NULL::schema_name.table_name))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.