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
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 dinpublic
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))
\dt[+] table_name
înpsql
.