使用 SQL 查询在 Postgresql 中获取函数、序列、类型等的定义

问题描述 投票:0回答:5

我需要 PostgreSQL 数据库对象的创建脚本。

我无法访问 pg_dump。所以我必须通过 SQL 查询来获取所有内容。我怎么能做到这一点?

sql postgresql ddl
5个回答
63
投票

要获取函数的定义,请使用

pg_get_functiondef()
:

select pg_get_functiondef(oid)
from pg_proc
where proname = 'foo';

还有类似的函数可以检索索引、视图、规则等的定义。有关详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/functions-info.html

获取用户类型的定义有点棘手。您需要查询

information_schema.attributes

select attribute_name, data_type
from information_schema.attributes
where udt_schema = 'public'
  and udt_name = 'footype'
order by ordinal_position;

您需要重新组装

create type
语句。

有关更多详细信息,您需要阅读系统目录的文档:http://www.postgresql.org/docs/current/static/catalogs.html

但是如果

information_schema
视图返回相同的信息,您应该更喜欢它们。


18
投票

psql -E
对于这项任务很有帮助。

像这样调用

psql
后,它会显示反斜杠命令使用的查询 - 如
\df+ myfunc
有关此功能的详细信息。

或者通过设置特殊变量在交互模式下实现相同的效果

ECHO_HIDDEN
:

\set ECHO_HIDDEN on

6
投票

这是使用 pg_get_functiondef 的完整示例查询:

WITH funcs AS (
  SELECT
    n.nspname AS schema
    ,proname AS sproc_name
    ,proargnames AS arg_names
    ,t.typname AS return_type
    ,d.description
    ,pg_get_functiondef(p.oid) as definition
  FROM pg_proc p
    JOIN pg_type t on p.prorettype = t.oid
    JOIN pg_description d on p.oid = d.objoid
    JOIN pg_namespace n on n.oid = p.pronamespace
  WHERE n.nspname = 'some_schema_name_here'
)
SELECT *
FROM funcs
;;

注意,您显然应该指定架构名称(如果您使用该架构,则应指定“public”)


5
投票

您还可以执行 \sf 来查看 psql 中的用户定义函数


2
投票
SELECT
    pp.proname,                                     --function name.
    pp.pronamespace::regnamespace::text AS schema,  --function located schema
    pg_get_functiondef(oid),                        --function def
    pg_get_function_arguments(oid),                 --(including default values).
    pg_get_function_identity_arguments(oid),        --This form omits default values.
    pg_get_function_result(oid)                     --Reconstructs the RETURNS clause of a function
FROM
    pg_proc pp
WHERE
    proname = 'eval_safe';

来自手册

pg_get_functiondef ( func oid ) → text   

重构函数或过程的创建命令。 (这 是反编译重建,不是命令原文。) 结果是完整的 CREATE OR REPLACE FUNCTION 或 CREATE OR REPLACE PROCEDURE 语句。

pg_get_function_arguments ( func oid ) → text

重建函数或过程的参数列表,形式为 它需要出现在 CREATE FUNCTION 中(包括默认的 值)。

pg_get_function_identity_arguments ( func oid ) → text

重建识别函数所需的参数列表或 过程,其形式需要出现在命令中,例如 作为更改功能。此表单省略了默认值。

pg_get_function_result ( func oid ) → text

重建函数的 RETURNS 子句,其形式为 需要出现在 CREATE FUNCTION 中。对于 a 返回 NULL 程序。

© www.soinside.com 2019 - 2024. All rights reserved.