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

260

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

类似于MySQL中的SHOW CREATE VIEW

9个回答

323

一直不得不回到这里查找pg_get_viewdef(怎样才能记住它!!),所以搜索了一个更容易记忆的命令... 然后找到了:

\d+ viewname

在pgsql命令行中键入\?,您可以看到类似类型的命令。

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


1
我通常将这个技巧与 \o 命令结合使用。我将 \d+ 转储到一些文件中,然后使用 vim 宏修改这些文件以满足我的需求。 - Brain90
遗憾的是:这个不能在没有psql的情况下使用。而“纯粹”的SQL命令版本(完全不使用pg_get_viewdef)可以,这样更具可移植性,例如对于带有DBI的Perl。 - Jinxed
1
更有用的是能够直接使用某种变体的\e命令(如\ef用于函数)来编辑视图定义代码。一个\ev功能会很不错。到目前为止,@Brain90建议的解决方案是我找到的最接近快速编辑视图定义的方法。 - Thalis K.
5
相关提示:\dv列出所有的视图。 - Nathan Long
@Jim U编辑了答案,将\d+改为\s+,但在我的postgresql版本中无效...他还说“l列出视图,s显示代码”...但是\l对我来说是列出数据库...有人知道上述内容在新的postgresql中是否有效吗? - EoghanM

219

2
很酷,它甚至可以漂亮地打印输出!:) 不过手册说它已经被弃用了... :( 谢谢! - Elias Dorneles
15
使用将名称转换为 OID 的版本:select pg_get_viewdef('viewname'::regclass, true) - user330315
4
与使用CAST不同的是,以下语句也可以实现相同的功能:SELECT pg_get_viewdef(to_regclass('视图名称'))(需要至少v9.4版本)。 - watery
1
非常感谢!我至少花了30分钟的时间寻找一些快速答案,期望会有像T-SQL中的“sp_help viewname”这样简单明了的方法,但事实并非如此。 - Stevey

82
select definition from pg_views where viewname = 'my_view'

1
谢谢这个..它允许我从我的程序中访问视图定义,而不仅仅是从psql客户端访问。 - Dominik Dorn
2
这样做的额外好处是它也适用于Amazon Redshift。 - Brent Writes Code
这对于不在搜索路径上的模式中的视图无效。它也不能区分不同模式中具有相同名称的两个视图。当我写模式时,我是指使用CREATE SCHEMA创建的命名空间。 - Michael Dillon
3
@MichaelDillon,使用select *而不是select definition,您将能够看到视图来自哪个模式,包括其他一些信息。 - Anders Kreinøe
3
如果您的视图不在搜索路径上,请使用select definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view' - bonh
这比使用函数 pg_get_viewdef() 好多了。 - Faustin Gashakamba

25

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

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

13

从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

7
哈哈,只是向他致敬。他在早期为psql做出了很多贡献。 https://git.postgresql.org/gitweb/?p=postgresql.git&a=search&h=HEAD&st=author&s=julian - Brain90

12

psql 命令行界面中,你可以使用

\d+ <yourViewName>
\sv <yourViewName>

输出结果如下:

\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

10

这里有一点需要指出。
使用函数pg_get_viewdefpg_views或信息模式中的views你总会得到一个重写版本,而非原始DDL版本。
重写版本可能与你的原始DDL脚本相同或不同。

如果规则管理器重写了你的视图定义,那么你的原始DLL将会丢失,你只能阅读到被重写后的视图定义。
并非所有的视图都会被重写,但如果你使用子查询或联接操作,你的视图很可能会被重写。


1
重要细节。这很烦人,因为我想要原始的“AS SELECT * FROM ...”语句。 - villasv

9
在命令行客户端psql中,您可以使用以下命令:
\sv <VIEWNAME>

-5

找到“CREATE TABLE…”查询的直接方法是使用以下查询:

SHOW TABLE your_schema_name.your_table_name

2
你好,欢迎来到Stackoverflow! 这个问题是为了展示一个“视图”的代码,而不是表格的。;-) - Elias Dorneles
1
嘿@EliasDorneles,这个查询非常完美地生成了view的代码(DDL)。我已经测试过了。 - Prashant K Tiwari
@PrashantKTiwari,如果视图连接多个表,您将如何在查询中指定表名?此外,可以使用同一张表创建许多视图,那么您将如何提取视图定义呢? 这里的问题是如何通过在查询中使用视图名称来生成已存在视图的create view ddl? - santosh tiwary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接