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.

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).


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


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'

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';

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.