Como ver o código CREATE VIEW para uma visualização no PostgreSQL?

173

Existe uma maneira fácil de ver o código usado para criar uma exibição usando o cliente de linha de comando do PostgreSQL?

Algo como o SHOW CREATE VIEWdo MySQL.

Elias Dorneles
fonte

Respostas:

229

Continuei tendo que voltar aqui para procurar pg_get_viewdef(como lembrar disso !!), então procurei por um comando mais memorável ... e consegui:

\d+ viewname

Você pode ver tipos semelhantes de comandos digitando \?na linha de comando pgsql.

Dica: o comando emacs sql-postgrestorna o pgsql muito mais agradável (editar, copiar, colar, histórico de comandos).

EoghanM
fonte
1
Eu costumo combinar esse truque com o comando \ o. Eu despejo \ d + para alguns arquivos e, em seguida, usando a macro vim, modifiquei esses arquivos para suprir minha necessidade.
Brain90
O triste é: isso não pode ser usado sem o psql. A versão de comando SQL "pura" (sem recorrer ao pg_get_viewdef) pode, que é mais portátil, por exemplo, para Perl com DBI.
Jinxed
1
O que seria mais útil é poder editar o código de definição de exibição diretamente com alguma variação do comando \ e, como \ ef para funções. Um recurso seria agradável. Até agora, a solução sugerida pelo @ Brain90 é a mais próxima que encontrei das definições rápidas de exibição de edição.
Thalis K.
1
Dica relacionada: \dvlista todas as visualizações
Nathan Long
120
select pg_get_viewdef('viewname', true)

Uma lista de todas essas funções está disponível no manual:

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

um cavalo sem nome
fonte
legal, até imprime bem! :) o manual diz que é obsoleto, embora ... :( graças!
Elias Dorneles
8
@elias: basta usar a versão que usa um OID lançando o nome para um oid:select pg_get_viewdef('viewname'::regclass, true)
a_horse_with_no_name
2
@elias como uma alternativa ao elenco, isso também funciona: SELECT pg_get_viewdef(to_regclass('viewname'))(requer pelo menos a v9.4).
aguado
49
select definition from pg_views where viewname = 'my_view'
Clodoaldo Neto
fonte
1
obrigado por este .. permite acessar a definição de view do meu programa ao invés de apenas do psql-client.
Dominik Dorn
2
Isso tem o benefício adicional de que também funciona para o Amazon Redshift.
Brent escreve código
Isso não funciona para visualizações em esquemas que não estão no caminho de pesquisa. E não distingue entre duas visualizações com o mesmo nome em esquemas diferentes. Quando eu escrevo esquema, estou me referindo ao namespace que você criar com CREATE SCHEMA
Michael Dillon
1
@MichaelDillon faça uma seleção * em vez de uma definição de seleção, e você poderá ver de que esquema é a exibição, incluindo algumas outras informações.
Anders Kreinøe
Se o seu ponto de vista não está no caminho de pesquisa, usoselect definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh
18

Se você deseja uma versão ANSI SQL-92:

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

GoodNews da v.9.6 e superior, a edição de visualização agora é nativa do psql. Apenas invoque o \evcomando. As definições de exibição serão exibidas no seu editor configurado.

julian@assange=# \ev {your_view_names}

Bônus. Algum comando útil para interagir com o buffer de consulta.

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
fonte
4
Haha, apenas para cumprimentá-lo. ele se compromete muito com o psql nos primeiros dias. git.postgresql.org/gitweb/...
Brain90
3

Isso é uma coisinha a salientar.
Usando a função pg_get_viewdef ou pg_views ou information_schema.views, você sempre terá uma versão reescrita do seu DDL original.
A versão rewited pode ou não ser igual ao seu script DDL de origem.

Se o Rule Manager reescrever sua definição de exibição, sua DLL original será perdida e você poderá ler a única versão reescrita de sua definição de exibição.
Nem todas as visualizações são reescritas, mas se você usar a sub-seleção ou a associação, provavelmente suas visualizações serão reescritas.

Gianluca Rossini
fonte