Comment voir le code CREATE VIEW pour une vue dans PostgreSQL?

173

Existe-t-il un moyen simple de voir le code utilisé pour créer une vue à l'aide du client de ligne de commande PostgreSQL?

Quelque chose comme celui SHOW CREATE VIEWde MySQL.

Elias Dorneles
la source

Réponses:

229

Je n'ai pas eu à revenir ici pour chercher pg_get_viewdef(comment s'en souvenir !!), alors j'ai cherché une commande plus mémorable ... et je l'ai obtenue:

\d+ viewname

Vous pouvez voir des sortes de commandes similaires en tapant \?sur la ligne de commande pgsql.

Astuce bonus: la commande emacs sql-postgresrend pgsql beaucoup plus agréable (éditer, copier, coller, historique des commandes).

EoghanM
la source
1
Je combine généralement cette astuce avec la commande \ o. Je vide \ d + dans certains fichiers, puis en utilisant la macro vim, j'ai modifié ces fichiers pour répondre à mes besoins.
Brain90
La chose triste est: cela ne peut pas être utilisé sans psql. La version de commande SQL "pure" (sans recourir du tout à pg_get_viewdef) peut, ce qui est plus portable, par exemple vers Perl avec DBI.
Jinxed le
1
Ce qui serait plus utile, c'est de pouvoir éditer le code de définition de vue directement avec une variante de la commande \ e, comme \ ef pour les fonctions. Une fonctionnalité \ ev serait bien. Jusqu'à présent, la solution suggérée par @ Brain90 est la plus proche que j'ai trouvée des définitions de vue d'édition rapide.
Thalis K.
1
Conseil associé: \dvrépertorie toutes les vues
Nathan Long
120
select pg_get_viewdef('viewname', true)

Une liste de toutes ces fonctions est disponible dans le manuel:

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

un cheval sans nom
la source
cool, il l'imprime même assez! :) le manuel dit qu'il est obsolète, cependant ... :( merci!
Elias Dorneles
8
@elias: utilisez simplement la version qui utilise un OID en convertissant le nom en un oid:select pg_get_viewdef('viewname'::regclass, true)
a_horse_with_no_name
2
@elias comme alternative au casting, cela fonctionne aussi: SELECT pg_get_viewdef(to_regclass('viewname'))(nécessite au moins la v9.4).
aqueux
49
select definition from pg_views where viewname = 'my_view'
Clodoaldo Neto
la source
1
merci pour celui-ci .. il permet d'accéder à la définition de la vue depuis mon programme plutôt que simplement depuis le client psql.
Dominik Dorn
2
Cela présente l'avantage supplémentaire de fonctionner également pour Amazon Redshift.
Brent écrit le code le
Cela ne fonctionne pas pour les vues dans les schémas qui ne sont pas sur le chemin de recherche. Et il ne fait pas la distinction entre deux vues portant le même nom dans des schémas différents. Quand j'écris schema, je fais référence à l'espace de noms que vous créez avec CREATE SCHEMA
Michael Dillon
1
@MichaelDillon fait un select * au lieu de select definition, et vous pourrez voir de quel schéma provient la vue, y compris quelques autres informations.
Anders Kreinøe
Si votre vue n'est pas sur le chemin de recherche, utilisezselect definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh
18

Si vous voulez une version ANSI SQL-92:

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

GoodNews à partir de la version 9.6 et supérieure, l'édition de vues est maintenant native de psql. Appelez simplement la \evcommande. Les définitions de vue s'afficheront dans votre éditeur configuré.

julian@assange=# \ev {your_view_names}

Prime. Une commande utile pour interagir avec le tampon de requête.

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
Cerveau90
la source
4
Haha, juste pour le saluer. il s'est beaucoup engagé dans psql au début. git.postgresql.org/gitweb/…
Brain90
3

C'est une petite chose à souligner.
En utilisant la fonction pg_get_viewdef ou pg_views ou information_schema.views, vous obtiendrez toujours une version réécrite de votre DDL d'origine.
La version modifiée peut être ou non la même que votre script DDL d'origine.

Si le gestionnaire de règles réécrit votre définition de vue, votre DLL d'origine sera perdue et vous pourrez lire uniquement la version réécrite de votre définition de vue.
Toutes les vues ne sont pas réécrites, mais si vous utilisez la sous-sélection ou les jointures, vos vues seront probablement réécrites.

Gianluca Rossini
la source