我正在编写自己的脚本来保存PostgreSQL数据库模式(包括视图,函数等)以进行版本控制。例如,我发现这种方式从数据库中获取函数名称和定义:
SELECT P.proname, pg_get_functiondef(P.oid)
FROM pg_proc P
LEFT JOIN pg_language L ON P.prolang=L.oid
WHERE P.pronamespace='public' AND (L.lanname='sql' OR L.lanname='plpgsql')
ORDER BY proname, proargnames, proargtypes
但是,尝试将表定义作为CREATE TABLE
语句似乎并不那么简单。我已经搜索过了,我找到的就是使用pg_dump
,这不是我想要的,因为:
exec
来自我的(Python)脚本。还有其他方法可以获得CREATE TABLE
声明吗? (基本上像MySQL中的DESCRIBE <table>
一样?)
答案 0 :(得分:1)
有很多函数可以在Pg中提取很多东西的定义,但是表格却不是其中之一。
craig=> select distinct proname from pg_proc where proname like 'pg_get_%';
proname
------------------------------------
pg_get_constraintdef
pg_get_expr
pg_get_function_arguments
pg_get_function_identity_arguments
pg_get_function_result
pg_get_functiondef
pg_get_indexdef
pg_get_keywords
pg_get_multixact_members
pg_get_ruledef
pg_get_serial_sequence
pg_get_triggerdef
pg_get_userbyid
pg_get_viewdef
(14 rows)
pg_get_viewdef
特别有用。
你唯一真正的选择是使用pg_dump --table ...
并修剪无关的东西。这是粗糙和笨拙的,但除非你想编写代码来自己构建DDL,否则你所拥有的只是。
我一直希望能够将客户端代码中的pg_dump
位用作库 - 或者甚至更好,从Pg中自我转储对象 - 但目前它不可用。