2014-01-10 44 views
0

我正在编写自己的脚本来保存用于版本控制的PostgreSQL数据库模式(包括视图,函数等)。例如,我发现这种方式从数据库中获取的功能名称和定义:在查询中获取CREATE TABLE定义

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. 这意味着我必须从我的(Python)的脚本exec东西。
  2. 它增加了所有我不想要的东西。

是否有另外一种方法获取CREATE TABLE声明? (基本上像MySQL中的DESCRIBE <table>

+0

不幸的是'psql'没有这样的功能,但是大多数的GUI客户端工具都可以做到这一点。 –

回答

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自身内部转储对象 - 但目前它不可用。

+0

我想'pg_dump'选项就是它了。同时也为我节省了倾销索引的麻烦,因为它们是作为奖金而来的:)。 'pg_get_viewdef' btw返回和'SELECT definition FROM pg_views'一样的东西,我现在正在使用这个视图。 –