在查询中获取CREATE TABLE定义

时间:2014-01-10 14:37:44

标签: postgresql

我正在编写自己的脚本来保存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,这不是我想要的,因为:

  1. 这意味着我必须使用exec来自我的(Python)脚本。
  2. 它添加了我不想要的所有额外的东西。
  3. 还有其他方法可以获得CREATE TABLE声明吗? (基本上像MySQL中的DESCRIBE <table>一样?)

1 个答案:

答案 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中自我转储对象 - 但目前它不可用。