Jak mohu zobrazit seznam všech sloupců pro zadanou tabulku?

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

  • Jaký druh přístupu máte k DB?
  • @dezso, je to na samostatném stroji, ale mohu se do něj přihlásit a spustit příkazový řádek psql s právy správce
  • Pokud vám rozumím správně, vy jsou po \dt[+] table_name v psql.
  • ne. \ dt + doesn explicitně nezobrazuje název sloupců. přidá pouze " popis " pole.
  • ale \ d + název tabulky funguje!

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ů v public 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)) 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *