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

Eli*_*les 153 postgresql

有没有一种简单的方法可以使用PostgreSQL命令行客户端查看用于创建视图的代码?

SHOW CREATE VIEW来自MySQL的东西.

Eog*_*anM 204

保持不得不回到这里查找pg_get_viewdef(如何记住!!),所以寻找一个更难忘的命令......并得到它:

\d+ viewname
Run Code Online (Sandbox Code Playgroud)

您可以通过\?在pgsql命令行输入来查看类似的命令.

额外提示:emacs命令sql-postgres使pgsql更加愉快(编辑,复制,粘贴,命令历史记录).

  • 相关提示:`\dv` 列出所有视图 (3认同)
  • 我通常将这个技巧与 \o 命令结合起来。我将 \d+ 转储到一些文件,然后使用 vim 宏修改这些文件以满足我的需要。 (2认同)

a_h*_*ame 102

select pg_get_viewdef('viewname', true)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @elias:只需使用通过将名称转换为oid来使用OID的版本:`select pg_get_viewdef('viewname':: regclass,true)` (7认同)
  • @elias 作为转换的替代方法,这也有效:`SELECT pg_get_viewdef(to_regclass('viewname'))`(至少需要 v9.4)。 (3认同)
  • 酷,它甚至打印得很漂亮!:) 手册说它已被弃用,但... :( 谢谢! (2认同)

Clo*_*eto 42

select definition from pg_views where viewname = 'my_view'
Run Code Online (Sandbox Code Playgroud)

  • @MichaelDillon 进行 select * 而不是 select 定义,您将能够看到视图来自哪个模式,包括一些其他信息。 (3认同)
  • 如果您的视图不在搜索路径上,请使用 `selectDefinition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'` (3认同)
  • 这有一个额外的好处,因为它也适用于Amazon Redshift. (2认同)

Ste*_*udd 13

如果您想要ANSI SQL-92版本:

select view_definition from information_schema.views where table_name = 'view_name';
Run Code Online (Sandbox Code Playgroud)


小智 12

psqlcli 中,您可以使用

\d+ <yourViewName>
\sv <yourViewName>
Run Code Online (Sandbox Code Playgroud)

输出如下:

\d+ v_ma_students

                               View "public.v_ma_students"
 Column |         Type          | Collation | Nullable | Default | Storage  | De
scription
--------+-----------------------+-----------+----------+---------+----------+---
SOMETHINGS HERE

View definition:
 SELECT student.sno,
    student.sname,
    student.ssex,
    student.sage,
    student.sdept
   FROM student
  WHERE student.sdept::text = 'MA'::text;
Options: check_option=cascaded


\sv v_ma_students

CREATE OR REPLACE VIEW public.v_ma_students AS
 SELECT student.sno,
    student.sname,
    student.ssex,
    student.sage,
    student.sdept
   FROM student
  WHERE student.sdept::text = 'MA'::text
 WITH CASCADED CHECK OPTION
Run Code Online (Sandbox Code Playgroud)


小智 10

这些都是需要指出的小事。
使用函数pg_get_viewdefpg_viewsinformation_schema.views,您将始终获得原始 DDL 的重写版本。
重写的版本可能与原始 DDL 脚本相同,也可能不同。

如果规则管理器重写您的视图定义,您的原始 DLL 将丢失,并且您将只能读取视图定义的重写版本。
并非所有视图都会被重写,但如果您使用子选择或联接,您的视图可能会被重写。


tru*_*kov 9

在命令行客户端psql中 ,您可以使用以下命令:

\dv <VIEWNAME>
Run Code Online (Sandbox Code Playgroud)


Bra*_*n90 6

来自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
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,只是为了向他致敬。在早期,他对psql付出了很多。https://git.postgresql.org/gitweb/?p=postgresql.git&amp;a=search&amp;h=HEAD&amp;st=author&amp;s=julian (3认同)