Hvordan lister jeg alle kolonner til en bestemt tabel

Jeg leder efter et præcist stykke information i en database, som jeg ikke har nogen viden om.

Det er et tredjepartsprodukt, de er langsomme med at besvare nogle spørgsmål, og jeg ved, at dataene ligger inde i den db, så jeg vil lave lidt retro-engineering.

givet en tabel, er det muligt at have en liste over kolonnerne til denne tabel?

For eksempel i SqlServer er det muligt at dumpe en tabel i en genanvendelig CREATE udsagn, der tekstvist viser alle de kolonner, som tabellen er sammensat af.

Kommentarer

  • Hvilken slags adgang har du til DB?
  • @dezso, den er på en separat maskine, men jeg kan logge ind på den og starte psql kommandolinje med administratorrettigheder
  • Hvis jeg forstår dig korrekt, kan du er efter \dt[+] table_name i psql.
  • nej. \ dt + betyder ikke ser ikke ud til at eksplicit vise kolonnenavnet. det tilføjer kun et " Beskrivelse " felt.
  • men \ d + tabelnavn fungerer!

Svar

Ud over kommandolinjen \d+ <table_name>, som du allerede har fundet, kunne du Brug også Informationsskema til at slå op i kolonnedataene ved hjælp af information_schema.columns :

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

Bemærk: I henhold til eksemplet ovenfor skal du sikre dig, at værdierne er indeholdt i anførselstegn.

Kommentarer

  • I psql skal du bruge \x on eller \pset expanded on til at lave forespørgslen resultater lineære (i stedet for tabelformede) og dermed lettere at læse stackoverflow.com/a/9605093/513397
  • I nuværende versioner (prøvede det i 9.6) kan du gøre i psql \d+ public.* for at få beskrivelsen (skema + indeces / fkeys / triggers) af alle dine tabeller og visninger i public skema. Vi bruger det i vores pre-commit hook-script til at holde styr på ændringer i DB foretaget af hver commit.
  • VÆLG kolonnenavn for kun at få kolonnenavn

Svar

Som supplement til de andre svar udsætter selv en SELECT-sætning, der ikke returnerer nogen rækker, kolonnenavnene for dig og applikationskoden.

select * from table_name where false; 

Tilladelser kan komme til at spille med en af disse tilgange.

Kommentarer

  • Jeg formoder, at du mener at overføre denne SQL til psql-kommandoen. Jeg foreslår at bruge –no-psqlrc-indstillingen i så fald for at undgå overraskelser i output.
  • Bortset fra de skjulte kolonner, som skulle specificeres for at blive valgt (som pg_class.oid)

Svar

informationsskema er den langsomme og sikre måde: det er standardiseret og stort set bærbart til andre databaser, der understøtter det. Og det fortsætter med at arbejde på tværs af større versioner.

viser i informationsskemaet ofte med mange tabeller fra systemkataloger for at opfylde et strengt standardiseret format – hvoraf mange kun er dødfragt det meste af tiden. Dette gør dem til langsomt .
Postgres-udviklerne giver ikke løfter, men grundlæggende (som hvad der er nødvendigt her) vil ikke ændre sig på tværs af større versioner.

psql (den oprindelige kommandolinjegrænseflade) tager selvfølgelig den hurtige bane og spørger kilden direkte . Hvis du starter psql med parameteren -E , er SQL bag tilbageslagskommandoer som \d vises. Eller \set ECHO_HIDDEN on fra kommandolinjen psql. Fra derfra kan du oprette et svar på dit spørgsmål.

Givet en tabel, er det muligt at have en liste over kolonnerne til dette 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; 

Hurtigere end forespørgsel information_schema.columns . Prøv EXPLAIN ANALYZE for at se det selv. Det betyder stadig ikke noget for en engangsopslag. Men kan gøre en forskel, hvis den bruges i en forespørgsel / funktion, der gentages mange gange.

Der er også subtile forskelle i synlighed. Detaljeret sammenligning:

Kommentarer

  • Kan virkelig lide, at du viser dig -E og viser folk, hvordan man får sql psql.
  • Jeg er enig.Jeg kørte nogle hastighedstest, og pg_catalog kører mere end 2x så hurtigt

Svar

psql på PostgreSQL 11+

Hvis du” søger efter kolonnetyperne på en forespørgsel, kan du bruge 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

Kun PostgreSQL

Dette er lidt hokey, men kan være en udfordrer, hvis du leder efter den kortest mulige SQL:

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

eller endnu kortere (forudsat at der er mindst en række til stede i tabellen)

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

Fortegnelsen bevarer ordren. Hvis du ikke er ligeglad med ordren og har hstore udvidelse, kan du gøre endnu kortere

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *