Szukam dokładnej informacji w bazie danych, o której nie mam żadnej wiedzy.
To jest produkt innej firmy, oni wolno odpowiadają na niektóre pytania i wiem, że dane znajdują się w tej bazie danych, więc chcę trochę popracować nad inżynierią retro.
Biorąc pod uwagę jedna tabela, czy można mieć listę nazw kolumn tej tabeli?
Na przykład w SqlServer można zrzucić tabelę do wielokrotnego użytku CREATE
, które tekstowo wymienia wszystkie kolumny, z których składa się tabela.
Komentarze
Odpowiedź
Oprócz wiersza poleceń \d+ <table_name>
, które już znalazłeś, możesz użyj również schematu informacyjnego , aby wyszukać dane kolumny, używając information_schema.columns
:
SELECT * FROM information_schema.columns WHERE table_schema = "your_schema" AND table_name = "your_table" ;
Uwaga: Jak w powyższym przykładzie, upewnij się, że wartości są ujęte w cudzysłowy.
Komentarze
- W psql użyj
\x on
lub\pset expanded on
, aby utworzyć zapytanie wyniki są liniowe (zamiast tabelaryczne), a przez to łatwiejsze do odczytania stackoverflow.com/a/9605093/513397 - W aktualnych wersjach (wypróbowałem w 9.6) możesz zrobić w psql
\d+ public.*
, aby uzyskać opis (schemat + indeces / fkeys / triggers) wszystkich swoich tabel i widoków wpublic
schemat. Używamy go w naszym skrypcie przechwytującym przed zatwierdzeniem, aby śledzić zmiany w bazie danych dokonywane przez każde zatwierdzenie. - SELECT nazwa_kolumny, aby uzyskać tylko nazwę kolumny
Odpowiedź
Jako uzupełnienie innych odpowiedzi, nawet instrukcja SELECT, która nie zwraca żadnych wierszy, ujawni nazwy kolumn Tobie i kodowi aplikacji.
select * from table_name where false;
W przypadku każdego z tych podejść w grę mogą wchodzić uprawnienia.
Komentarze
- Zakładam, że chcesz przekazać ten kod SQL do polecenia psql. Proponuję użyć w takim przypadku opcji –no-psqlrc, aby uniknąć niespodzianek na wyjściu.
- Z wyjątkiem ukrytych kolumn, które musiały być określone, aby były wybrane (jak pg_class.oid)
Odpowiedź
schemat informacji to powolny i pewny sposób: jest ustandaryzowany i w dużej mierze przenośny do innych baz danych, które go obsługują. I będzie nadal działać w głównych wersjach.
Jednak wyświetlenia w schemacie informacyjnym często dołączają do wiele tabel z katalogów systemowych , aby ściśle znormalizowany format – z których wiele to przez większość czasu martwy ładunek. To sprawia, że powolne .
Programiści Postgres nie obiecują, ale podstawy (takie jak to, co jest tutaj potrzebne) nie zmienią się w głównych wersjach.
psql
(natywny interfejs wiersza poleceń) zajmuje oczywiście szybką ścieżkę i bezpośrednio pyta o źródło . Jeśli rozpoczniesz psql
z parametrem -E
, kod SQL za Wyświetlane są polecenia z ukośnikiem odwrotnym, takie jak \d
. Lub \set ECHO_HIDDEN on
z wiersza poleceń psql. Zaczynając od tego miejsca możesz zbudować odpowiedź na swoje pytanie.
Biorąc pod uwagę jedną tabelę, czy można mieć listę nazw kolumn do table.
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;
Szybciej niż zapytania information_schema.columns
. Spróbuj EXPLAIN ANALYZE
i przekonaj się sam. Wciąż nie ma znaczenia dla jednorazowego wyszukiwania. Ale może mieć znaczenie, jeśli zostanie użyte w zapytaniu / funkcji, która jest wielokrotnie powtarzana.
Istnieją również drobne różnice w widoczności. Szczegółowe porównanie:
Komentarze
- Naprawdę w ten sposób pokazujesz
-E
i pokazujesz ludziom, jak zdobyć sql psql. - Zgadzam się.Przeprowadziłem kilka testów szybkości i pg_catalog działa ponad 2x szybciej
Odpowiedź
psql
na PostgreSQL 11+
Jeśli szukasz typów kolumn w zapytaniu, możesz użyć 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)
Odpowiedź
Tylko PostgreSQL
To trochę dziwaczne, ale może być rywalem, jeśli szukasz możliwie najkrótszego SQL:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON)))
lub nawet krócej (zakładając, że w tabeli jest co najmniej jeden wiersz)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
Lista zachowuje kolejność. Jeśli nie przejmujesz się zamówieniem i masz zainstalowane rozszerzenie hstore
, możesz zrobić jeszcze krócej
SELECT skeys(hstore(NULL::schema_name.table_name))
\dt[+] table_name
wpsql
.