Hledám přesnou informaci v databázi, o které nemám žádné znalosti.
Je to produkt třetí strany, na odpovědi na některé otázky reaguje pomalu a vím, že data leží uvnitř této databáze, takže chci udělat trochu retro inženýrství.
Vzhledem k tomu jedna tabulka, je možné mít seznam názvů sloupců pro tuto tabulku?
Například v SqlServeru je možné vypsat tabulku do opakovaně použitelného CREATE
prohlášení, která textově uvádí všechny sloupce, ze kterých se tabulka skládá.
Komentáře
Odpověď
Kromě příkazového řádku \d+ <table_name>
, který jste již našli, můžete také použijte Informační schéma k vyhledání dat sloupce pomocí information_schema.columns
:
SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ;
Poznámka: Podle výše uvedeného příkladu zkontrolujte, zda jsou hodnoty uzavřeny v uvozovkách.
Komentáře
- V psql použijte dotaz
\x on
nebo\pset expanded on
výsledky lineární (místo tabulkových) a tím snadněji čitelné stackoverflow.com/a/9605093/513397 - V aktuálních verzích (vyzkoušejte to v 9.6) můžete udělat v psql
\d+ public.*
a získat popis (schéma + indeces / fkeys / triggery) všech vašich tabulek a pohledů vpublic
schéma. Používáme to v našem háčkovém skriptu před spácháním, abychom udrželi přehled o změnách v DB provedených každým potvrzením. - VYBERTE název_sloupce, abyste získali pouze název sloupce
Odpověď
Jako doplněk k dalším odpovědím vystaví i příkaz SELECT, který nevrací žádné řádky, názvy sloupců pro vás a pro kód aplikace.
select * from table_name where false;
S některým z těchto přístupů by mohla přijít oprávnění.
Komentáře
- Předpokládám, že chcete předat tento SQL příkazu psql. V takovém případě doporučuji použít volbu –no-psqlrc, aby nedošlo k překvapení ve výstupu.
- Kromě skrytých sloupců, které je třeba specifikovat, aby byly vybrány (jako pg_class.oid)
Odpověď
informační schéma je pomalý a jistý způsob: je standardizovaný a převážně přenosný do jiných databází, které jej podporují. A bude i nadále fungovat napříč hlavními verzemi.
zobrazení v informačním schématu se však často připojí mnoho tabulek z systémových katalogů , které splňují přísně standardizovaný formát – mnoho z nich je většinou jen mrtvý náklad. Díky tomu jsou pomalé .
Vývojáři Postgresu nedávají sliby, ale základy (jako třeba zde) se nebudeme měnit u hlavních verzí.
psql
(nativní rozhraní příkazového řádku) se samozřejmě ubírá rychlým pruhem a dotazuje se přímo na zdroj . Pokud začnete psql
s parametrem -E
, použije se SQL Zobrazí se příkazy zpětného lomítka jako \d
. Nebo \set ECHO_HIDDEN on
z příkazového řádku psql. Od této chvíle můžete vytvořit odpověď na svou otázku.
Vzhledem k jedné tabulce je možné mít pro tuto skupinu seznam názvů sloupců. tabulka.
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;
Rychlejší než dotazování information_schema.columns
. Zkuste EXPLAIN ANALYZE
přesvědčit se sami. Stále není důležité pro jednorázové vyhledávání. Může se ale lišit, pokud se použije v dotazu / funkci, která se mnohokrát opakuje.
Existují také jemné rozdíly ve viditelnosti. Podrobné srovnání:
Komentáře
- Opravdu tak vám ukážete
-E
a ukážete lidem, jak získat sql psql. - Souhlasím.Provedl jsem několik testů rychlosti a program pg_catalog běží více než dvakrát tak rychle
Answer
psql
na PostgreSQL 11+
Pokud hledáte v dotazu typy sloupců, můžete použít 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)
odpověď
Pouze PostgreSQL
Toto je poněkud hokey, ale může být uchazečem, pokud hledáte nejkratší možný SQL:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON)))
nebo dokonce kratší (za předpokladu, že v tabulce je alespoň jeden řádek)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
Výpis zachovává pořadí. Pokud se o objednávku nestaráte a máte hstore
nainstalované rozšíření, můžete udělat ještě kratší
SELECT skeys(hstore(NULL::schema_name.table_name))
\dt[+] table_name
vpsql
.