Jak wyświetlić kod CREATE VIEW dla widoku w PostgreSQL?

173

Czy istnieje łatwy sposób, aby zobaczyć kod użyty do utworzenia widoku za pomocą klienta wiersza poleceń PostgreSQL?

Coś jak SHOW CREATE VIEWz MySQL.

Elias Dorneles
źródło

Odpowiedzi:

229

Ciągle musiałem wracać tutaj, aby spojrzeć w górę pg_get_viewdef(jak to zapamiętać !!), więc szukałem bardziej zapadającego w pamięć polecenia ... i otrzymałem:

\d+ viewname

Możesz zobaczyć podobne rodzaje poleceń, wpisując \?w wierszu poleceń pgsql.

Dodatkowa wskazówka: polecenie emacs sql-postgressprawia, że ​​pgsql jest o wiele przyjemniejszy (edycja, kopiowanie, wklejanie, historia poleceń).

EoghanM
źródło
1
Zwykle łączę tę sztuczkę z poleceniem \ o. Zrzucam \ d + do niektórych plików, a następnie używając makra Vima zmodyfikowałem te pliki, aby zaspokoić moje potrzeby.
Brain90
Smutne jest to, że nie można tego używać bez psql. "Czysta" wersja polecenia SQL (bez uciekania się do pg_get_viewdef) może, co jest bardziej przenośne, np. Do Perla z DBI.
Jinxed
1
Bardziej użyteczna byłaby możliwość bezpośredniej edycji kodu definicji widoku z pewnymi odmianami polecenia \ e, na przykład \ ef dla funkcji. Przydałaby się nowa funkcja. Jak dotąd rozwiązanie sugerowane przez @ Brain90 jest najbliższe, jakie znalazłem, do definicji widoków szybkiej edycji.
Thalis K.
1
Powiązana wskazówka: \dvzawiera listę wszystkich wyświetleń
Nathan Long
120
select pg_get_viewdef('viewname', true)

Lista wszystkich tych funkcji jest dostępna w instrukcji:

http://www.postgresql.org/docs/current/static/functions-info.html

koń bez imienia
źródło
fajnie, nawet ładnie to drukuje! :) instrukcja mówi, że jest przestarzała, chociaż ... :( dzięki!
Elias Dorneles
8
@elias: po prostu użyj wersji, która używa OID, rzutując nazwę na select pg_get_viewdef('viewname'::regclass, true)
oid
2
@elias jako alternatywa dla przesyłania, to też działa: SELECT pg_get_viewdef(to_regclass('viewname'))(wymaga co najmniej wersji 9.4).
wodnisty
49
select definition from pg_views where viewname = 'my_view'
Clodoaldo Neto
źródło
1
dzięki za to ... pozwala na dostęp do definicji widoku z mojego programu, a nie tylko z klienta psql.
Dominik Dorn
2
Ma to dodatkową zaletę, ponieważ działa również w przypadku Amazon Redshift.
Brent pisze kod
Nie działa to w przypadku widoków w schematach, które nie znajdują się na ścieżce wyszukiwania. I nie rozróżnia dwóch widoków o tej samej nazwie w różnych schematach. Kiedy piszę schemat, mam na myśli przestrzeń nazw, którą tworzysz za pomocą CREATE SCHEMA
Michael Dillon
1
@MichaelDillon wybierz opcję select * zamiast definicji wyboru, a będziesz mógł zobaczyć, z jakiego schematu pochodzi widok, w tym kilka innych informacji.
Anders Kreinøe
Jeśli twój widok nie znajduje się na ścieżce wyszukiwania, użyjselect definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh
18

Jeśli chcesz mieć wersję ANSI SQL-92:

select view_definition from information_schema.views where table_name = 'view_name';
Steve Judd
źródło
8

GoodNews od wersji 9.6 i nowszych, edycja widoku jest teraz natywna z psql. Po prostu wywołaj \evpolecenie. Definicje widoku pojawią się w skonfigurowanym edytorze.

julian@assange=# \ev {your_view_names}

Premia. Kilka przydatnych poleceń do interakcji z buforem zapytań.

Query Buffer
  \e [FILE] [LINE]       edit the query buffer (or file) with external editor
  \ef [FUNCNAME [LINE]]  edit function definition with external editor
  \ev [VIEWNAME [LINE]]  edit view definition with external editor
  \p                     show the contents of the query buffer
  \r                     reset (clear) the query buffer
  \s [FILE]              display history or save it to file
  \w FILE                write query buffer to file
Mózg90
źródło
4
Haha, tylko po to, żeby mu pozdrowić. poświęcił się dużo psql na początku. git.postgresql.org/gitweb/…
Brain90
3

To drobiazg, na który należy zwrócić uwagę.
Używając funkcji pg_get_viewdef lub pg_views lub information_schema.views , zawsze otrzymasz przepisaną wersję swojego oryginalnego DDL.
Przeredagowana wersja może być taka sama, jak pierwotny skrypt DDL, ale nie musi.

Jeśli Menedżer reguł przepisze definicję widoku, oryginalna biblioteka DLL zostanie utracona i będzie można odczytać jedyną przepisaną wersję definicji widoku.
Nie wszystkie widoki są przepisywane, ale jeśli użyjesz sub-select lub łączenia, prawdopodobnie Twoje widoki zostaną przepisane.

Gianluca Rossini
źródło