2014-01-10 47 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'一樣的東西,我現在正在使用這個視圖。 –