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

173

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

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

Элиас Дорнелес
источник

Ответы:

229

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

\d+ viewname

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

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

EoghanM
источник
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

a_horse_with_no_name
источник
круто, это даже симпатично печатает! :) руководство говорит, что это устарело, хотя ... :( спасибо!
Элиас Дорнелес
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
18

Если вы хотите версию ANSI SQL-92:

select view_definition from information_schema.views where table_name = 'view_name';
Стив Джадд
источник
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
Brain90
источник
4
Хаха, просто чтобы приветствовать его. он много совершал psql в первые дни. git.postgresql.org/gitweb/…
Brain90
3

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

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

Джанлука Россини
источник