【问题标题】:How to see the CREATE VIEW code for a view in PostgreSQL?如何在 PostgreSQL 中查看视图的 CREATE VIEW 代码?
【发布时间】:2013-01-16 01:24:10
【问题描述】:

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

类似于 MySQL 中的 SHOW CREATE VIEW

【问题讨论】:

    标签: postgresql view definition


    【解决方案1】:

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

    \d+ viewname
    

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

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

    【讨论】:

    • 我通常将此技巧与 \o 命令结合使用。我将 \d+ 转储到一些文件中,然后使用 vim 宏修改了这些文件以满足我的需要。
    • 可悲的是:没有 psql 就无法使用。 “纯” SQL 命令版本(根本不使用 pg_get_viewdef)可以,它更便携,例如使用 DBI 到 Perl。
    • 更有用的是能够使用 \e 命令的一些变体直接编辑视图定义代码,例如函数的 \ef。一个 \ev 功能会很好。到目前为止,@Brain90 建议的解决方案是我发现的最接近快速编辑视图定义的解决方案。
    • 相关提示:\dv 列出所有视图
    【解决方案2】:
    select pg_get_viewdef('viewname', true)
    

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

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

    【讨论】:

    • 酷,它甚至可以漂亮地打印出来! :) 手册说它已被弃用,但... :( 谢谢!
    • @elias:通过将名称转换为 oid 来使用使用 OID 的版本:select pg_get_viewdef('viewname'::regclass, true)
    • @elias 作为强制转换的替代方法,这也可以:SELECT pg_get_viewdef(to_regclass('viewname'))(至少需要 v9.4)。
    【解决方案3】:
    select definition from pg_views where viewname = 'my_view'
    

    【讨论】:

    • 感谢这个......它允许从我的程序访问视图定义,而不仅仅是从 psql 客户端访问。
    • 这还有一个额外的好处是它也适用于 Amazon Redshift。
    • 这不适用于架构中不在搜索路径上的视图。并且它不区分不同模式中具有相同名称的两个视图。当我编写模式时,我指的是您使用 CREATE SCHEMA 创建的命名空间
    • @MichaelDillon 选择 * 而不是选择定义,您将能够看到视图来自哪个架构,包括其他一些信息。
    • 如果您的视图不在搜索路径上,请使用select definition from pg_views where schemaname = 'my_schema' and viewname = 'my_view'
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      来自 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
      

      【讨论】:

      【解决方案6】:

      这些是需要指出的一点。
      使用函数 pg_get_viewdefpg_views 或 information_schema.views 您将始终获得原始 DDL 的重写版本
      重写后的版本可能与您的原始 DDL 脚本相同,也可能不同。

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

      【讨论】:

        【解决方案7】:

        psql cli 中,可以使用

        \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
        

        【讨论】:

          【解决方案8】:

          在命令行客户端psql你可以使用以下命令:

          \sv <VIEWNAME>
          

          【讨论】:

            【解决方案9】:

            查找“CREATE TABLE ...”查询的直接方法是使用此查询 -

            SHOW TABLE your_schema_name.your_table_name
            

            【讨论】:

            • 您好,欢迎来到 Stackoverflow!这个问题是为了显示view 的代码,而不是表格。 ;-)
            • 嘿@EliasDorneles,此查询也可以很好地生成view 的代码(DDL)。已经测试过了。
            猜你喜欢
            • 2012-03-07
            • 2016-08-05
            • 2020-08-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多