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
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 ipublic
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))
\dt[+] table_name
ipsql
.