Come elenco tutte le colonne per una tabella specificata

Sto cercando uninformazione 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 allinterno di quel db, quindi voglio fare un po di ingegneria retrò.

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

Ad esempio in SqlServer, è possibile eseguire il dump di una tabella in un , che elenca testualmente tutte le colonne di cui è composta la tabella.

Commenti

  • Che tipo di accesso hai a il DB?
  • @dezso, è su una macchina separata, ma posso accedervi e avviare la riga di comando di psql, con i diritti di amministratore
  • Se ho capito bene, tu sono dopo \dt[+] table_name in psql.
  • no. \ dt + non sembra mostrare esplicitamente il nome delle colonne. aggiunge solo un campo " Descrizione ".
  • ma \ d + nome tabella funziona!

Risposta

Oltre alla riga di comando \d+ <table_name> che hai già trovato, potresti utilizza anche lo schema delle informazioni per cercare i dati delle colonne, utilizzando information_schema.columns :

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

Nota: come nellesempio precedente, assicurati che i valori siano racchiusi tra virgolette.

Commenti

  • In psql, utilizza \x on o \pset expanded on per effettuare la query risultati lineari (anziché tabulari) e quindi più facili da leggere stackoverflow.com/a/9605093/513397
  • Nelle versioni correnti (provato in 9.6) puoi fare in psql \d+ public.* per ottenere la descrizione (schema + indeces / fkeys / triggers) di tutte le tue tabelle e viste nel public schema. Lo usiamo nel nostro script hook pre-commit per tenere traccia in git delle modifiche nel DB apportate da ogni commit.
  • SELEZIONA nome_colonna per ottenere solo il nome della colonna

Risposta

Come supplemento alle altre risposte, anche unistruzione SELECT che non restituisce righe esporrà i nomi delle colonne a te e al codice dellapplicazione.

select * from table_name where false; 

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

Commenti

  • Presumo che tu voglia passare questo SQL al comando psql. Suggerisco di utilizzare lopzione –no-psqlrc in questo caso per evitare sorprese nelloutput.
  • Tranne per le colonne nascoste, che dovevano essere specificate per essere selezionate (come pg_class.oid)

Risposta

Il schema delle informazioni è il modo lento e sicuro: è standardizzato e in gran parte portabile su altri database che lo supportano. E continuerà a funzionare nelle versioni principali.

Tuttavia, views nello schema delle informazioni spesso si uniscono molte tabelle dai cataloghi di sistema per soddisfare rigorosamente formato standardizzato, molti dei quali sono solo merci morte per la maggior parte del tempo. Questo li rende lenti .
Gli sviluppatori di Postgres non fanno promesse, ma nozioni di base (come ciò che è necessario qui) non cambierà tra le versioni principali.

psql (linterfaccia della riga di comando nativa) prende la corsia di sorpasso, ovviamente, e interroga direttamente la fonte . Se inizi psql con il parametro -E , lSQL dietro vengono visualizzati i comandi con barra rovesciata come \d. Oppure \set ECHO_HIDDEN on dalla riga di comando di psql. Partendo da lì puoi costruire una risposta alla tua domanda.

Data una tabella, è possibile avere un elenco dei nomi delle colonne per questo 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 query information_schema.columns . Prova EXPLAIN ANALYZE per verificarlo di persona. Ancora poco importa per una ricerca una tantum. Ma potrebbe fare la differenza se utilizzato in una query / funzione ripetuta molte volte.

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

Commenti

  • Davvero così ti mostri -E e mostri alle persone come ottenere lo sql di psql.
  • Sono daccordo.Ho eseguito alcuni test di velocità e il pg_catalog viene eseguito più del doppio della velocità

Answer

psql su PostgreSQL 11+

Se” stai cercando i tipi di colonna su una query, puoi utilizzare 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) 

Risposta

Solo PostgreSQL

Questo è un po stupido ma potrebbe essere un contendente se stai cercando lSQL più breve possibile:

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

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

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

Linserzione conserva lordine. Se non ti interessa lordine e hai installato hstore estensione, puoi farlo anche più breve

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *