Cum listez toate coloanele pentru un tabel specificat

Caut o informație precisă într-o bază de date despre care nu știu.

Este „un produs de la o terță parte, ei răspund lent la unele întrebări și știu că datele se află în interiorul acelui db, așa că vreau să fac un pic de inginerie retro.

Având în vedere un tabel, este posibil să aveți o listă cu numele coloanelor pentru acest tabel?

De exemplu, în SqlServer, este posibil să aruncați un tabel într-un declarații, care listează textual toate coloanele din care este compus tabelul.

Comentarii

  • Ce fel de acces trebuie să DB?
  • @dezso, este pe o mașină separată, dar mă pot conecta la acesta și pot lansa linia de comandă psql, cu drepturi de administrator
  • Dacă te înțeleg corect, tu sunt după \dt[+] table_name în psql.
  • nu. \ dt + doesn t par să afișeze în mod explicit numele coloanelor. adaugă doar un câmp " Descriere ".
  • dar numele tabelei \ d + funcționează!

Răspuns

În plus față de linia de comandă \d+ <table_name> pe care ați găsit-o deja, ați putea utilizați, de asemenea, Schema de informații pentru a căuta datele coloanei, utilizând information_schema.columns :

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

Notă: conform exemplului de mai sus, asigurați-vă că valorile sunt cuprinse între ghilimele.

Comentarii

  • În psql, utilizați \x on sau \pset expanded on pentru a face interogarea rezultate liniare (în loc de tabelare) și astfel mai ușor de citit stackoverflow.com/a/9605093/513397
  • În versiunile actuale (a încercat în 9.6) puteți face în psql \d+ public.* pentru a obține descrierea (schema + indeces / fkeys / triggers) a tuturor tabelelor și vizualizărilor din public schemă. Îl folosim în scriptul de cârlig de pre-commit pentru a urmări în git modificările din DB făcute de fiecare commit.
  • SELECT nume_coloană pentru a obține doar numele coloanei

Răspuns

Ca supliment la celelalte răspunsuri, chiar și o instrucțiune SELECT care nu returnează niciun rând va expune numele coloanelor dvs. și codului aplicației.

select * from table_name where false; 

Permisiunile pot intra în joc cu oricare dintre aceste abordări.

Comentarii

  • Presupun că vrei să treci acest SQL la comanda psql. Vă sugerez să folosiți opțiunea –no-psqlrc în acest caz pentru a evita surprize în rezultat.
  • Cu excepția coloanelor ascunse, care trebuiau specificate pentru a fi selectate (cum ar fi pg_class.oid)

Răspuns

schema de informații este modalitatea lentă și sigură: este standardizată și în mare măsură portabilă către alte baze de date care o susțin. Și va continua să funcționeze în versiunile majore.

Cu toate acestea, vizualizări în schema de informații se alătură adesea multe tabele din cataloage de sistem pentru a îndeplini un format standardizat – dintre care multe sunt doar transport de marfă de cele mai multe ori. Acest lucru îi face lent .
Dezvoltatorii Postgres nu fac promisiuni, dar elementele de bază (cum ar fi ceea ce este necesar aici) nu se vor schimba între versiunile majore.

psql (interfața nativă a liniei de comandă) ia firul rapid, desigur, și interogă sursa direct . Dacă începeți psql cu parametrul -E , SQL din spatele sunt afișate comenzi de tip backslash precum \d. Sau \set ECHO_HIDDEN on din linia de comandă psql. Începând de acolo puteți crea un răspuns la întrebarea dvs.

Având în vedere un singur tabel, este posibil să aveți o listă cu numele coloanelor tabel.

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; 

Mai rapid decât interogare information_schema.columns . Încercați EXPLAIN ANALYZE pentru a vedea de unul singur. Încă nu contează pentru o căutare unică. Dar s-ar putea să facă o diferență dacă este folosit într-o interogare / funcție care se repetă de multe ori.

Există, de asemenea, diferențe subtile de vizibilitate. = „2e16bd9b86″>

Cum se verifică dacă există un tabel într-o schemă dată

Comentarii

  • Chiar așa îți arăți -E și le arăți oamenilor cum să obțină sql de psql.
  • Sunt de acord.Am efectuat câteva teste de viteză și pg_catalog rulează mai mult de 2x la fel de rapid

Răspuns

psql pe PostgreSQL 11+

Dacă„ căutați tipurile de coloane dintr-o interogare, puteți utiliza 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) 

Răspuns

Numai PostgreSQL

Aceasta este oarecum hokey, dar ar putea fi un concurent dacă căutați cel mai scurt SQL posibil:

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

sau chiar mai scurt (presupunând că există cel puțin un rând prezent în tabel)

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

Listarea păstrează comanda. În cazul în care nu vă pasă de comandă și aveți instalată extensia hstore, puteți face și mai scurt

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *