2015-06-01 65 views
1

場景:在沒有命令行的情況下恢復postgresql轉儲(.sql文件)?

我已經構建了一個使用postgresql數據庫的PHP框架。該框架附帶一個.sql文件,該文件是該框架所需的默認表和數據的轉儲。

我希望能夠從客戶端(PHP)運行sql文件,而不是命令行,以便導入數據。這是因爲我遇到了一些服務器設置,其中訪問命令行並不總是可能的,並且/或者不能運行某些命令(例如,PHP用戶可能無法訪問pg_restore)。

我試圖簡單地分割.sql文件並將其作爲查詢使用pg_sql PHP擴展來運行,但是因爲轉儲文件使用COPY命令來創建數據,所以這似乎不起作用。這似乎是因爲使用了COPY,.sql文件希望使用pg_restore命令導入(除非我錯過了某些內容?)。

問:

所以現在的問題是,我怎麼能恢復.SQL轉儲,或在某種程度上創造的.sql轉儲,它可以通過客戶端(PHP),而不是在命令行中恢復?

例如:

<?php pg_query(file_get_contents($sqlFile)); ?> 

不是:錯誤

$ pg_restore -d dbname filename 

實施例:

我使用的pgAdmin III,以產生.SQL轉儲,使用 「普通」設置。在.sql文件,將被插入到表中的數據是這樣的:

COPY core_classes_models_api (id, label, class, namespace, description, "extensionName", "readAccess") FROM stdin; 
1 data Data \\Core\\Components\\Apis\\Data The data api Core 310 
\. 

如果我然後運行的pgAdmin III查詢窗口內上面的SQL,我得到以下錯誤:

ERROR: syntax error at or near "1" 
LINE 708: 1 data Data \\Core\\Components\\Apis\\Data The data api Core... 
+0

如果它是實際的SQL轉儲(而不是例如pg_dump的自定義格式),那麼您可以將查詢運行到數據庫中 –

+0

我的初始想法是相同的。我已經嘗試過使用.sql文件,但它是COPY語句和導致問題的數據格式。這可能是因爲我使用pgAdmin III嗎?上面提到的pg_dump的自定義格式是?我已經在上面添加了一個示例。 –

+0

看起來像它想從標準輸入的數據,我懷疑你可以從PHP調用dup。嘗試重寫文件以插入值 –

回答

1

找到這個有點棘手,但經過一番調查,似乎pg_dump的「普通」格式(它生成純文本SQL文件)默認生成COPY命令而不是INSERT命令。

看看pg_dump here的規格,我找到了--inserts的選項。配置此選項將允許轉儲在通常創建COPY命令的位置創建INSERT命令。

的規範確實狀態:

This will make restoration very slow; it is mainly useful for making dumps that can be loaded into non-PostgreSQL databases. However, since this option generates a separate command for each row, an error in reloading a row causes only that row to be lost rather than the entire table contents.

然而,這適合我的目的,希望能幫助其他有同樣的問題!

相關問題