Etsin tarkkaa tietoa tietokannasta, josta minulla ei ole tietoa.
Se on kolmannen osapuolen tuote, he vastaavat hitaasti joihinkin kysymyksiin, ja tiedän, että tiedot ovat kyseisen db sisällä, joten haluan tehdä vähän retro-tekniikkaa.
Annettu yksi taulukko, onko mahdollista saada luettelo tämän taulukon sarakkeiden nimistä?
Esimerkiksi SqlServerissä on mahdollista pudottaa taulukko uudelleenkäytettävään CREATE
-lausekkeet, joissa luetellaan kaikki sarakkeet, joista taulukko koostuu.
Kommentit
vastaus
Jo löytämiesi komentorivien \d+ <table_name>
lisäksi voit käytä myös tietomallia etsiäksesi saraketiedot käyttämällä information_schema.columns
:
SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ;
Huomaa: Varmista yllä olevan esimerkin mukaisesti, että arvot ovat lainausmerkeissä.
Kommentit
- Tee psql: ssä kysely
\x on
tai\pset expanded on
. tulokset ovat lineaarisia (taulukkojen sijaan) ja siten helpommin luettavia stackoverflow.com/a/9605093/513397 - Nykyisissä versioissa (kokeillut sitä) kohdassa 9.6) voit tehdä psql: ssä
\d+ public.*
saadaksesi kaikkien taulukoiden ja näkymien kuvauksen (kaava + indekit / fkeys / laukaisimet)public
-malli. Käytämme sitä ennen sitoutumista koukkukomentosarjassa seurataksemme jokaisen sitoutuneen DB: n muutoksia. - SELECT column_name saadaksesi vain sarakkeen nimen
Vastaus
Muiden vastausten täydennyksenä jopa SELECT-käsky, joka ei palauta rivejä, paljastaa sarakkeiden nimet sinulle ja sovelluskoodille.
select * from table_name where false;
Luvat saattavat tulla peliin kaikilla näistä lähestymistavoista.
Kommentit
- i Oletan, että tarkoitat tämän SQL: n välittämistä psql-komennolle. Ehdotan tällöin –no-psqlrc -vaihtoehtoa, jotta vältetään yllätykset tuotoksessa.
- Paitsi piilotetut sarakkeet, jotka oli määritettävä valittaviksi (kuten pg_class.oid)
Vastaa
tietomalli on hidas ja varma tapa: se on standardoitu ja suurelta osin siirrettävissä muihin sitä tukeviin tietokantoihin. Ja se toimii edelleen tärkeimmissä versioissa.
Tietomallin näkymät kuitenkin liittyvät usein monet -järjestelmän luetteloiden taulukot täyttävät tiukasti standardoitu muoto – joista monet ovat vain kuolleita rahteja suurimman osan ajasta. Tämä tekee heistä hitaasti .
Postgres-kehittäjät eivät anna lupauksia, mutta perustiedot (kuten mitä täällä tarvitaan) ei tule muuttumaan pääversioiden välillä.
psql
(natiivi komentoriviliittymä) vie tietysti pikakaistan ja kyselee lähdettä suoraan . Jos aloitat psql
parametrilla -E
, takana oleva SQL Backslash-komennot, kuten \d
, näytetään. Tai \set ECHO_HIDDEN on
psql-komentoriviltä. Sieltä alkaen voit rakentaa vastauksen kysymykseesi.
Voiko yhdellä taulukolla olla luettelo sarakkeiden nimistä tätä varten taulukko.
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;
Nopeampi kuin kysely information_schema.columns
. Kokeile EXPLAIN ANALYZE
nähdäksesi sen itse. Silti tuskin on merkitystä kertaluonteiselle etsinnälle. Mutta saattaa olla merkitystä, jos sitä käytetään kyselyssä / toiminnossa, joka toistuu useita kertoja.
Näkyvyydessä on myös hienovaraisia eroja. Yksityiskohtainen vertailu:
Kommentit
- Oikeasti näytät sinulle
-E
ja näytät ihmisille, kuinka saada psl: n sql. - Olen samaa mieltä.Suoritin joitain nopeustestit ja pg_catalog toimii yli kaksi kertaa niin nopeasti
vastaus
psql
PostgreSQL 11+ -käyttöjärjestelmässä
Jos etsit saraketyyppejä kyselystä, voit käyttää 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)
vastaus
vain PostgreSQL
Tämä on hieman hokey, mutta voi olla haastaja, jos etsit mahdollisimman lyhyttä SQL: ää:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON)))
tai jopa lyhyempi (olettaen, että taulukossa on vähintään yksi rivi)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
Tiedot säilyttävät järjestyksen. Jos et välitä tilauksesta ja sinulla on hstore
-laajennus asennettuna, voit tehdä siitä vieläkin lyhyemmän
SELECT skeys(hstore(NULL::schema_name.table_name))
\dt[+] table_name
jälkeenpsql
.