Hoe geef ik een lijst van alle kolommen voor een opgegeven tabel

Ik ben op zoek naar een nauwkeurig stuk informatie in een database waar ik geen kennis van heb.

Het is een product van derden, ze zijn traag met het beantwoorden van sommige vragen, en ik weet dat de gegevens in die databank zitten, dus ik wil wat retro-engineering doen.

Gegeven één tabel, is het mogelijk om een lijst te hebben met de namen van de kolommen voor deze tabel?

In SqlServer is het bijvoorbeeld mogelijk om een tabel in een herbruikbare CREATE statements, die tekstueel alle kolommen weergeeft waaruit de tabel is samengesteld.

Opmerkingen

  • Wat voor soort toegang heb je tot de DB?
  • @dezso, het staat op een aparte machine, maar ik kan erop inloggen en psql-opdrachtregel starten, met beheerdersrechten
  • Als ik je goed begrijp, jij zijn na \dt[+] table_name in psql.
  • nee. \ dt + doesn t lijkt de kolomnaam expliciet weer te geven. het voegt alleen een ” Beschrijving ” veld toe.
  • maar \ d + tabelnaam werkt!

Answer

Naast de opdrachtregel \d+ <table_name> die u al hebt gevonden, kunt u gebruik ook het informatieschema om de kolomgegevens op te zoeken met information_schema.columns :

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

Opmerking: zoals in het bovenstaande voorbeeld, zorg ervoor dat de waarden tussen aanhalingstekens staan.

Opmerkingen

  • Gebruik in psql \x on of \pset expanded on om de zoekopdracht uit te voeren resultaten lineair (in plaats van tabel) en dus gemakkelijker te lezen stackoverflow.com/a/9605093/513397
  • In huidige versies (probeer het in 9.6) kun je doen in psql \d+ public.* om de beschrijving (schema + indeces / fkeys / triggers) van al je tabellen en views in de public schema. We gebruiken het in ons pre-commit hook-script om wijzigingen in de DB die door elke commit zijn gemaakt bij te houden.
  • SELECTEER kolomnaam om alleen kolomnaam te krijgen

Answer

Als aanvulling op de andere antwoorden, zal zelfs een SELECT-instructie die geen rijen retourneert, de kolomnamen aan jou en aan de applicatiecode blootstellen.

select * from table_name where false; 

Toestemmingen kunnen een rol spelen bij elk van deze benaderingen.

Opmerkingen

  • Ik neem aan dat u van plan bent deze SQL door te geven aan de psql-opdracht. Ik raad aan om in dat geval de optie –no-psqlrc te gebruiken om verrassingen in de uitvoer te voorkomen.
  • Behalve de verborgen kolommen, die moesten worden gespecificeerd om te worden geselecteerd (zoals pg_class.oid)

Antwoord

De informatieschema is de langzame en zekere manier: het is gestandaardiseerd en grotendeels overdraagbaar naar andere databases die het ondersteunen. En het blijft werken in de hoofdversies.

views in het informatieschema doen echter vaak mee veel tabellen uit de systeemcatalogi om aan een strikt gestandaardiseerd formaat – waarvan er veel meestal gewoon dode vracht zijn. Dit maakt ze traag .
De Postgres-ontwikkelaars doen geen beloftes, maar de basis (zoals wat hier nodig is) zullen niet veranderen tussen hoofdversies.

psql (de native opdrachtregelinterface) neemt natuurlijk de snelste weg en vraagt de bron rechtstreeks . Als u psql start met de parameter -E , is de SQL erachter backslash-commandos zoals \d worden weergegeven. Of \set ECHO_HIDDEN on vanaf de psql-opdrachtregel. Van daaruit kunt u een antwoord op uw vraag opbouwen.

Gegeven een tabel, is het mogelijk om een lijst te hebben met de namen van de kolommen hiervoor 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; 

Sneller dan ondervragen van information_schema.columns . Probeer EXPLAIN ANALYZE om het zelf te zien. Nog steeds nauwelijks belangrijk voor een eenmalige opzoeking. Maar het kan een verschil maken als het wordt gebruikt in een zoekopdracht / functie die vaak wordt herhaald.

Er zijn ook subtiele verschillen in zichtbaarheid. Gedetailleerde vergelijking:

Opmerkingen

  • Vind het echt leuk dat je je -E laat zien en mensen laat zien hoe je de sql van psql kunt krijgen.
  • Ik ben het ermee eens.Ik heb een aantal snelheidstests uitgevoerd en de pg_catalog werkt meer dan 2x zo snel

Answer

psql op PostgreSQL 11+

Als u” zoekt naar de kolomtypen in een zoekopdracht, kunt u 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) 

Antwoord

Alleen PostgreSQL

Dit is een beetje hokey maar kan een kanshebber zijn als je op zoek bent naar de kortst mogelijke SQL:

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

of zelfs korter (ervan uitgaande dat er ten minste één rij in de tabel aanwezig is)

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

De vermelding behoudt de volgorde. In het geval dat de bestelling u niets kan schelen en de hstore extensie is geïnstalleerd, kunt u nog korter doen

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *