Как увидеть код CREATE VIEW для представления в PostgreSQL?

Есть ли простой способ увидеть код, используемый для создания представления с помощью клиента командной строки PostgreSQL?

Что-то вроде SHOW CREATE VIEW из MySQL.


person Elias Dorneles    schedule 31.01.2013    source источник


Ответы (6)


Мне приходилось возвращаться сюда, чтобы найти pg_get_viewdef (как это запомнить !!), поэтому поискал более запоминающуюся команду ... и получил ее:

\d+ viewname

Вы можете увидеть похожие типы команд, набрав \? в командной строке pgsql.

Дополнительный совет: команда emacs sql-postgres делает pgsql намного более приятным (редактирование, копирование, вставка, история команд).

person EoghanM    schedule 14.03.2013
comment
Я обычно совмещаю этот трюк с командой \ o. Я сбрасываю \ d + в некоторые файлы, а затем с помощью макроса vim изменил эти файлы, чтобы удовлетворить свои потребности. - person Brain90; 19.05.2015
comment
Печально то, что это невозможно использовать без psql. Чистая версия команды SQL (без использования pg_get_viewdef вообще) может, что более переносимо, например в Perl с DBI. - person Jinxed; 23.07.2015
comment
Что было бы более полезно, так это иметь возможность редактировать код определения представления напрямую с помощью некоторого варианта команды \ e, например \ ef для функций. Любая функция была бы хороша. Пока что решение, предложенное @ Brain90, является наиболее близким к быстрому редактированию определений представлений, которое я нашел. - person Thalis K.; 02.06.2016
comment
Совет по теме: \dv перечисляет все просмотры - person Nathan Long; 17.09.2018

select pg_get_viewdef('viewname', true)

Список всех этих функций доступен в руководстве:

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

person a_horse_with_no_name    schedule 31.01.2013
comment
круто, он даже красивенько распечатывает! :) в руководстве написано, что он устарел, хотя ... :( спасибо! - person Elias Dorneles; 01.02.2013
comment
@elias: просто используйте версию, которая использует OID, преобразовав имя в oid: select pg_get_viewdef('viewname'::regclass, true) - person a_horse_with_no_name; 01.02.2013
comment
@elias как альтернатива кастингу, тоже работает: SELECT pg_get_viewdef(to_regclass('viewname')) (требуется как минимум v9.4). - person watery; 13.06.2018

Если вам нужна версия ANSI SQL-92:

select view_definition from information_schema.views where table_name = 'view_name';
person Steve Judd    schedule 09.08.2016

Хорошие новости от v9.6 и выше. Редактирование представлений теперь осуществляется в psql. Просто вызовите команду \ev. Определения просмотра будут отображаться в настроенном вами редакторе.

julian@assange=# \ev your_view_names

Бонус. Некоторая полезная команда для взаимодействия с буфером запросов.

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
person Brain90    schedule 08.04.2017
comment
Ха-ха, просто чтобы поприветствовать его. он много делал с psql в первые дни. git.postgresql.org/gitweb/ - person Brain90; 30.08.2017

Это небольшая вещь, на которую стоит обратить внимание.
Используя функцию pg_get_viewdef, pg_views или information_schema.views , вы всегда получите переписанную версию исходного DDL.
Перепрошенная версия может или нет быть таким же, как ваш исходный сценарий DDL.

Если диспетчер правил перепишет ваше определение представления, ваша исходная DLL будет потеряна, и вы сможете прочитать только переписанную версию определения представления.
Не все представления переписываются, но если вы используете подвыбор или объединение, вероятно, ваши представления будут переписаны.

person Gianluca Rossini    schedule 27.09.2018

person    schedule
comment
спасибо за это .. он позволяет получить доступ к определению представления из моей программы, а не только из клиента psql. - person Dominik Dorn; 19.07.2014
comment
Это имеет дополнительное преимущество, так как работает и с Amazon Redshift. - person Brent Writes Code; 23.06.2015
comment
Это не работает для представлений в схемах, которые не находятся на пути поиска. И он не делает различий между двумя представлениями с одинаковыми именами в разных схемах. Когда я пишу схему, я имею в виду пространство имен, которое вы создаете с помощью CREATE SCHEMA. - person Michael Dillon; 29.09.2016
comment
@MichaelDillon сделайте выбор * вместо определения выбора, и вы сможете увидеть, из какой схемы взято представление, включая некоторую другую информацию. - person Anders Kreinøe; 23.01.2017
comment
Если ваше представление не находится на пути поиска, используйте select definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view' - person bonh; 22.04.2019