Wie wird der CREATE VIEW-Code für eine Ansicht in PostgreSQL angezeigt?

173

Gibt es eine einfache Möglichkeit, den Code anzuzeigen, der zum Erstellen einer Ansicht mit dem PostgreSQL-Befehlszeilenclient verwendet wird?

So etwas wie das SHOW CREATE VIEWvon MySQL.

Elias Dorneles
quelle

Antworten:

229

Ich musste hierher zurückkehren, um nachzuschauen pg_get_viewdef(wie man sich daran erinnert !!), also suchte ich nach einem denkwürdigeren Befehl ... und bekam ihn:

\d+ viewname

Sie können ähnliche Arten von Befehlen \?anzeigen, indem Sie in die Befehlszeile pgsql eingeben.

Bonus-Tipp: Der Befehl emacs sql-postgresmacht pgsql viel angenehmer (Bearbeiten, Kopieren, Einfügen, Befehlsverlauf).

EoghanM
quelle
1
Normalerweise kombiniere ich diesen Trick mit dem Befehl \ o. Ich speichere \ d + in einige Dateien und ändere diese Dateien dann mit dem vim-Makro, um meinen Bedarf zu decken.
Brain90
Traurige Sache ist: Dies kann nicht ohne psql verwendet werden. Die "reine" SQL-Befehlsversion (ohne auf pg_get_viewdef zurückzugreifen) kann, was portabler ist, zB nach Perl mit DBI.
Jinxed
1
Nützlicher wäre es, den Ansichtsdefinitionscode mit einer Variation des Befehls \ e direkt bearbeiten zu können, z. B. \ ef für Funktionen. Ein \ ev Feature wäre schön. Bisher ist die von @ Brain90 vorgeschlagene Lösung der schnellsten Bearbeitung von Ansichtsdefinitionen am nächsten gekommen.
Thalis K.
1
In Verbindung stehender Tipp: \dvlistet alle Ansichten auf
Nathan Long
120
select pg_get_viewdef('viewname', true)

Eine Liste aller dieser Funktionen finden Sie im Handbuch:

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

ein Pferd ohne Name
quelle
cool, es druckt es sogar hübsch! :) das Handbuch sagt, dass es veraltet ist, obwohl ... :( danke!
Elias Dorneles
8
@elias: Verwenden Sie einfach die Version, die eine OID verwendet, indem Sie den Namen in eine OID select pg_get_viewdef('viewname'::regclass, true)
umwandeln
2
@elias als Alternative zum Casting funktioniert dies auch: SELECT pg_get_viewdef(to_regclass('viewname'))(erfordert mindestens v9.4).
wässrig
49
select definition from pg_views where viewname = 'my_view'
Clodoaldo Neto
quelle
1
danke für diesen einen .. es ermöglicht den Zugriff auf die Ansichtsdefinition von meinem Programm und nicht nur vom psql-Client.
Dominik Dorn
2
Dies hat den zusätzlichen Vorteil, dass es auch für Amazon Redshift funktioniert.
Brent schreibt Code
Dies funktioniert nicht für Ansichten in Schemas, die sich nicht im Suchpfad befinden. Und es wird nicht zwischen zwei Ansichten mit demselben Namen in verschiedenen Schemata unterschieden. Wenn ich ein Schema schreibe, beziehe ich mich auf den Namespace, den Sie mit CREATE SCHEMA
Michael Dillon
1
@MichaelDillon Wählen Sie anstelle der Auswahldefinition * aus, und Sie können sehen, aus welchem ​​Schema die Ansicht stammt, einschließlich einiger anderer Informationen.
Anders Kreinøe
Wenn Ihre Ansicht nicht auf dem Suchpfad ist, verwenden Sieselect definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh
18

Wenn Sie eine ANSI SQL-92-Version wünschen:

select view_definition from information_schema.views where table_name = 'view_name';
Steve Judd
quelle
8

GoodNews ab Version 9.6, Ansichtsbearbeitung ist jetzt nativ von psql. Rufen Sie einfach den \evBefehl auf. Ansichtsdefinitionen werden in Ihrem konfigurierten Editor angezeigt.

julian@assange=# \ev {your_view_names}

Bonus. Ein nützlicher Befehl zur Interaktion mit dem Abfragepuffer.

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
Brain90
quelle
4
Haha, nur um ihn zu grüßen. er hat sich in den frühen Tagen viel für psql engagiert. git.postgresql.org/gitweb/…
Brain90
3

Dies ist eine kleine Sache, auf die man hinweisen sollte.
Mit der Funktion pg_get_viewdef oder pg_views oder information_schema.views erhalten Sie immer eine umgeschriebene Version Ihrer ursprünglichen DDL.
Die überarbeitete Version kann mit Ihrem ursprünglichen DDL-Skript identisch sein oder nicht.

Wenn der Regel-Manager Ihre Ansichtsdefinition neu schreibt, geht Ihre ursprüngliche DLL verloren und Sie können nur die neu geschriebene Version Ihrer Ansichtsdefinition lesen.
Nicht alle Ansichten werden neu geschrieben, aber wenn Sie Unterauswahl oder Verknüpfungen verwenden, werden Ihre Ansichten wahrscheinlich neu geschrieben.

Gianluca Rossini
quelle