Jag letar efter en exakt information i en databas som jag inte har någon kunskap om.
Det är en tredjepartsprodukt, de svarar långsamt på några frågor, och jag vet att data ligger inne i den db, så jag vill göra lite retroteknik.
Givet en tabell, är det möjligt att ha en lista med kolumnen för den här tabellen?
Till exempel i SqlServer är det möjligt att dumpa en tabell i en återanvändbar CREATE
uttalanden, som textvis listar alla kolumner som tabellen består av.
Kommentarer
Svar
Förutom kommandoraden \d+ <table_name>
du redan hittat kan du använd också Informationsschema för att leta upp kolumndata med information_schema.columns
:
SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ;
Obs! Enligt exemplet ovan, se till att värdena är inkluderade i offertar.
Kommentarer
- I psql använder du
\x on
eller\pset expanded on
för att göra frågan resultat linjära (istället för tabellformade) och därmed lättare att läsa stackoverflow.com/a/9605093/513397 - I nuvarande versioner (försökte det i 9.6) kan du göra i psql
\d+ public.*
för att få beskrivningen (schema + indeces / fkeys / triggers) för alla dina tabeller och vyer ipublic
-schema. Vi använder det i vårt pre-commit hook-skript för att hålla reda på ändringar i DB som gjorts av varje commit. - VÄLJ kolumnnamn för att bara få kolumnnamn
Svar
Som ett komplement till de andra svaren exponerar även ett SELECT-uttalande som inte ger några rader kolumnnamnen för dig och applikationskoden.
select * from table_name where false;
Behörigheter kan spela med någon av dessa metoder.
Kommentarer
- Jag antar att du menar att skicka denna SQL till psql-kommandot. Jag föreslår att du använder alternativet –no-psqlrc i så fall för att undvika överraskningar i utdata.
- Förutom de dolda kolumnerna, som måste specificeras för att väljas (som pg_class.oid)
Svar
informationsschema är det långsamma och säkra sättet: det är standardiserat och till stor del bärbart till andra databaser som stöder det. Och det kommer att fortsätta fungera i större versioner.
visar i informationsschemat ofta med många tabeller från systemkataloger för att möta en strikt standardiserat format – varav många bara är döda gods för det mesta. Detta gör att de långsamma .
Postgres-utvecklarna gör inte löften, men grunderna (som vad som behövs här) kommer inte att förändras över större versioner.
psql
(det inbyggda kommandoradsgränssnittet) tar naturligtvis snabbfältet och frågar källan direkt . Om du startar psql
med parametern -E
, ligger SQL bakom backslash-kommandon som \d
visas. Eller \set ECHO_HIDDEN on
från kommandoraden psql. Från och med därifrån kan du skapa ett svar på din fråga.
Givet en tabell, är det möjligt att ha en lista med kolumnen för detta tabell.
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;
Snabbare än frågar information_schema.columns
. Försök med EXPLAIN ANALYZE
för att se själv. Det är fortfarande knappast viktigt för en engångssökning. Men kan göra skillnad om den används i en fråga / funktion som upprepas många gånger.
Det finns också subtila skillnader i synlighet. Detaljerad jämförelse:
Kommentarer
- Gillar verkligen att du visar dig
-E
och visar människor hur man får SQL-filen psql. - Jag håller med.Jag körde några hastighetstester och pg_catalog kör mer än 2x så snabbt
Svar
psql
på PostgreSQL 11+
Om du letar efter kolumntyper i en fråga kan du använda 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)
Svar
Endast PostgreSQL
Det här är lite hokey men kan vara en utmanare om du letar efter kortast möjliga SQL:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON)))
eller ännu kortare (förutsatt att det finns minst en rad i tabellen)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
Listan bevarar ordern. Om du inte bryr dig om beställningen och har hstore
tillägg kan du göra ännu kortare
SELECT skeys(hstore(NULL::schema_name.table_name))
\dt[+] table_name
ipsql
.