2014-01-20 41 views
0

我是一個相當新的postgresql,需要在php中構建自定義備份和還原腳本。從閱讀這裏的帖子,我瞭解到psql -E這將輸出到終端SQL爲一個\命令postgres用來描述一個序列,表,視圖等
我不能弄清楚,以便我可以複製sql我的工作中的語句是如何組合2個或更多的sql語句以實現最終結果。例如,\d mytable將輸出可用於爲備份腳本創建CREATE TABLE腳本的表的結構。這需要4個查詢。是否有一套方法可以將這些查詢合併起來?揭祕postgresql 內部查詢

+0

你問的是如何從PHP執行'psql -E',如何解析'psql'的輸出,如何生成'CREATE TABLE'語句或以上都不是? –

+0

我在問如何在斜槓命令('\ d mytable')中顯示任何一組查詢'psql -E',這樣我就可以理解它在php代碼中的使用。對於如何使用或鏈接在一起的兩個或多個查詢,必須有某種邏輯。它們不是子查詢。它們是否起作用? – dwlamb

回答

1

你不想使用psql的信息查詢(\ commands)。你需要的是pg_dump,而不是psqlpsql向您展示了表格外觀的人類可讀視圖; pg_dump爲您提供了DDL重新創建它,這是你說你想要的,因爲你正在試圖創建一個「備份腳本」。

不幸的是,目前pg_dump不是真的可以作爲庫調用,並且提取它的查詢並不簡單。相反,您通常需要調用pg_dump作爲shell命令。

對於視圖,您可以使用SQL函數SELECT pg_get_viewdef('view_name')。不幸的是,對於表或其他數據庫對象沒有等價物。請參閱system information functions

psql一樣,pg_dump可能會使用一系列查詢爲給定命令構造SQL文本。你可以找到pg_dump如何構建這些在source code for pg_dump,特別是可怕的pg_dump.c。見dumpTable() for instance

請注意,如果您嘗試複製pg_dump如何複製它,您將爲自己創建一個維護噩夢。請記住,PostgreSQL目錄並不保證從版本到版本穩定 - 類似psqlpg_dumpinformation_schema等工具通常可以保護您免受此類更改。如果您深入研究目錄,那麼每次發佈主要版本時都必須重新測試,並處理任何落後的compat中斷。看看pg_dump中的所有特定於版本的案例,瞭解自己的想法。

我覺得這很爛,那的pg_dump核心功能應該在libpqdump或在服務器端擴展,但遺憾的是它沒有了,沒有人願意做,使所需的大量工作那可能。

簡短版本:只需使用pg_dump。它支持選擇性轉儲選項,如-t,如果你需要它們。

+1

+1我很確定這是OP想要的,儘管他否認這一點。這是一個經典的[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)恕我直言。 –

+0

@ÁlvaroG.VicarioHuh,我不知道這個謬誤有一個名字。我通常會寫(當我可以被打擾的時候),比如「請解釋* why * this * how *;你試圖解決的根本問題是什麼,而不是你認爲你應該如何解決它。「 –

+0

@CraigRinger。如果使用pg_dump是一個選項,我不會試圖編寫自己的和恢復備份腳本來通過瀏覽器操作數據庫。我用於生產/託管的ISP有一個非常有限的界面只有PhpPgAdmin。在我的開發方面使用pg_dump是可以的,但是我們已經查看了開關和選項來縮小它,但是它仍然會生成一個需要大量編輯的轉儲文件,然後我才能夠輕鬆地複製並粘貼到PhpPgAdmin查詢textarea中。一個用CREATE TABLE語句查詢要重建的元素的方法 – dwlamb