Pontos információt keresek egy adatbázisban, amelyről nincs tudomásom.
Ez egy harmadik féltől származó termék, lassan válaszolnak néhány kérdésre, és tudom, hogy az adatok abban a db-ben rejlenek, ezért szeretnék egy kicsit retrotechnikával foglalkozni.
Adva egy tábla, lehet-e listát az oszlopok nevéről ehhez a táblához?
Például az SqlServerben lehetséges egy táblát egy újrafelhasználható utasítások, amelyek szövegesen felsorolják az összes oszlopot, amelyekből a táblázat áll. a DB?
\dt[+] table_name
után vannak a psql
-ban. Válasz
A már megtalált \d+ <table_name>
parancssoron kívül használja az információs sémát az oszlopadatok megkereséséhez a information_schema.columns
:
SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ;
Megjegyzés: A fenti példa szerint ellenőrizze, hogy az értékek idézőjelek közé vannak-e foglalva.
Megjegyzések
Válasz
A többi válasz kiegészítéseként még egy sor sem visszatérő SELECT utasítás is kiteszi az oszlopneveket Önnek és az alkalmazás kódjának.
select * from table_name where false;
Az engedélyek ezeknek a megközelítéseknek bármelyikével játszhatók lehetnek.
Megjegyzések
- Feltételezem, hogy ezt az SQL-t akarod átadni a psql parancsnak. Azt javaslom, hogy ebben az esetben használja a –no-psqlrc opciót, hogy elkerülje a meglepetéseket a kimenetben.
- Kivéve a rejtett oszlopokat, amelyeket meg kellett adni a kiválasztáshoz (például pg_class.oid)
Válasz
A információséma a lassú és biztos út: szabványosított és nagyrészt hordozható más, ezt támogató adatbázisokban. És továbbra is működik a főbb verziók között.
Azonban az információsémában az nézetek gyakran csatlakoznak a rendszerkatalógusok számos táblája szigorúan megfelel szabványosított formátum – amelyek közül sok a legtöbb esetben csak halott teherfuvar. Ez lassúvá teszi őket .
A Postgres fejlesztői nem ígérgetéseket tesznek, hanem alapokat (például itt szükségeseket) A fő verziók nem változnak.
psql
(a natív parancssori felület) természetesen a gyors sávot választja, és közvetlenül lekérdezi a forrást . Ha a psql
elemet a -E
paraméterrel indítja, akkor az SQL mögött olyan backslash parancsok jelennek meg, mint a \d
. Vagy \set ECHO_HIDDEN on
a psql parancssorból. Innentől kezdve felépítheti a választ a kérdésére.
Adhat egy táblázatot az oszlopok nevének listájához ehhez táblázat.
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;
Gyorsabb, mint lekérdezés information_schema.columns
. Próbálkozzon a EXPLAIN ANALYZE
vel, hogy megbizonyosodjon róla. Még mindig alig számít az egyszeri kereséshez. De változhat, ha egy olyan lekérdezésben / függvényben használják, amelyet sokszor ismételnek.
A láthatóságban vannak finom különbségek is. Részletes összehasonlítás:
Megjegyzések
- Nagyon tetszik, hogy megmutatja
-E
, és megmutatja az embereknek, hogyan lehet megszerezni a psql sql-jét. - Egyetértek.Futtattam néhány sebességtesztet, és a pg_catalog több mint kétszer olyan gyorsan fut
Answer
psql
a PostgreSQL 11+ rendszeren
Ha oszloptípusokat keres egy lekérdezésnél, használhatja a 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)
Válasz
csak a PostgreSQL
Ez kissé hokey, de versenyző lehet, ha a lehető legrövidebb SQL-t keresed:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON)))
vagy még rövidebb (feltételezve, hogy a táblázatban legalább egy sor van)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
A lista fenntartja a sorrendet. Abban az esetben, ha nem érdekel a megrendelés, és telepítve van a hstore
kiterjesztés, akkor még rövidebbet tehet
SELECT skeys(hstore(NULL::schema_name.table_name))
\x on
vagy\pset expanded on
parancsot a lekérdezés elkészítéséhez eredmények lineárisak (táblázatos helyett), és így könnyebben olvashatók stackoverflow.com/a/9605093/513397\d+ public.*
fájlban megteheti az összes tábla és nézet leírását (séma + indekciók / fkeys / triggerek) apublic
séma. Az előzetes elkötelezettségű szkriptünkben nyomon követjük az egyes elkötelezettek által végrehajtott változtatásokat a DB-ben.