如何在PostgreSQL中查看视图的CREATE VIEW代码?


Answers:


229

不得不返回这里进行查找pg_get_viewdef(如何记住它!),因此搜索了一个更令人难忘的命令……并得到:

\d+ viewname

您可以通过\?在pgsql命令行中键入来查看类似的命令。

sql-postgres温馨提示:emacs命令使pgsql更加令人愉悦(编辑,复制,粘贴,命令历史记录)。


1
我通常将此技巧与\ o命令结合使用。我将\ d +转储到某些文件中,然后使用vim宏修改了这些文件以满足我的需要。
Brain90

可悲的是:没有psql不能使用它。可以使用“纯” SQL命令版本(根本不需要使用pg_get_viewdef),例如,使用DBI的Perl更具移植性。
金克斯

1
更加有用的是,能够使用\ e命令的某些变体直接编辑视图定义代码,例如函数的\ ef。\ ev功能会很好。到目前为止,@ Brain90建议的解决方案是我发现的与快速编辑视图定义最接近的解决方案。
塔利斯K.16年

1
相关技巧:\dv列出所有视图
Nathan Long

120
select pg_get_viewdef('viewname', true)

手册中提供了所有这些功能的列表:

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


很酷,它甚至可以打印漂亮的照片!:)手册说它已被弃用,但是... :(谢谢!
Elias Dorneles

8
@elias:通过将名称强制转换为oid来使用使用OID的版本:select pg_get_viewdef('viewname'::regclass, true)
a_horse_with_no_name 2013年

2
@elias作为强制转换的替代方法,它也适用:(SELECT pg_get_viewdef(to_regclass('viewname'))至少需要v9.4)。
水汪汪的

49
select definition from pg_views where viewname = 'my_view'

1
感谢这一点..它允许从我的程序中访问视图定义,而不仅仅是从psql-client中访问。
多米尼克多恩

2
这样做还有一个好处,就是它也适用于Amazon Redshift。
布伦特撰写代码

这不适用于不在搜索路径中的架构中的视图。并且它不会在不同模式中区分两个具有相同名称的视图。在编写架构时,我指的是您使用CREATE SCHEMA创建的名称空间
Michael Dillon

1
@MichaelDillon进行选择*而不是选择定义,您将能够查看视图所基于的架构,包括一些其他信息。
AndersKreinøe17年

如果您的视图不在搜索路径中,请使用select definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
bonh '19

18

如果要使用ANSI SQL-92版本:

select view_definition from information_schema.views where table_name = 'view_name';

8

v.9.6及更高版本中的GoodNews,视图编辑现在来自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将丢失,并且您将只能读取视图定义的重写版本。
并非所有视图都会被重写,但是如果您使用子选择或联接,则可能会重写您的视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.