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


173

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

Нечто подобное SHOW CREATE VIEWиз MySQL.

Ответы:


229

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

\d+ viewname

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

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


1
Я обычно комбинирую этот трюк с командой \ o. Я дамп \ d + в некоторые файлы, а затем с помощью макроса Vim я изменил эти файлы, чтобы обеспечить мою потребность.
Brain90

Грустная вещь: это не может быть использовано без PSQL. «Чистая» версия SQL-команды (без использования pg_get_viewdef) может, что более переносимо, например, для Perl с DBI.
Jinxed

1
Что было бы более полезно, так это возможность редактировать код определения представления напрямую с помощью некоторого варианта команды \ e, например \ ef для функций. Функция \ ev была бы хороша. Пока что решение, предложенное @ Brain90, наиболее близко к быстрому редактированию определений видов.
Талис К.

1
Подсказка: \dvсписок всех просмотров
Натан Лонг

120
select pg_get_viewdef('viewname', true)

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

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


круто, это даже симпатично печатает! :) руководство говорит, что это устарело, хотя ... :( спасибо!
Элиас Дорнелес

8
@elias: просто используйте версию, которая использует OID, select pg_get_viewdef('viewname'::regclass, true)
приведя

2
@elias в качестве альтернативы касту, это тоже работает: SELECT pg_get_viewdef(to_regclass('viewname'))(требуется как минимум v9.4).
водянистая

49
select definition from pg_views where viewname = 'my_view'

1
спасибо за это .. он позволяет получить доступ к определению представления из моей программы, а не только из psql-клиента.
Доминик Дорн

2
Это имеет дополнительное преимущество в том, что оно работает и для Amazon Redshift.
Брент пишет код

Это не работает для представлений в схемах, которые не находятся в пути поиска. И он не различает два представления с одинаковыми именами в разных схемах. Когда я пишу схему, я имею в виду пространство имен, которое вы создаете с помощью CREATE SCHEMA
Майкл Диллон,

1
@MichaelDillon делает выбор * вместо определения выбора, и вы сможете увидеть, из какой схемы этот вид, включая некоторые другие сведения.
Андерс Крейнё

Если ваш взгляд не на пути поиска, используйтеselect definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh


8

GoodNews от v.9.6 и выше, редактирование View теперь является родным для 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

4
Хаха, просто чтобы приветствовать его. он много совершал psql в первые дни. git.postgresql.org/gitweb/…
Brain90

3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.