簡體   English   中英

恢復沒有命令行的postgresql轉儲(.sql文件)?

[英]Restore a postgresql dump (.sql file) without the command line?

場景:

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

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

我曾嘗試簡單地將.sql文件拆分並使用pg_sql PHP擴展名作為查詢運行,但是由於轉儲文件使用COPY命令創建數據,因此這似乎不起作用。 似乎是因為使用了COPY,.sql文件希望使用pg_restore命令導入(除非我遺漏了什么?)。

題:

所以問題是,如何還原.sql轉儲,或以可以通過客戶端(PHP)而不是命令行進行還原的方式創建.sql轉儲?

例如:

<?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...

查找起來有些棘手,但是經過一番調查,看來pg_dump的“普通”格式(生成純文本SQL文件)默認情況下生成COPY命令而不是INSERT命令。

這里查看pg_dump的規范,我找到了--inserts的選項。 配置此選項將允許轉儲在通常創建COPY命令的地方創建INSERT命令。

規范確實指出:

這會使恢復非常緩慢。 它主要用於制作可以裝入非PostgreSQL數據庫的轉儲。 但是,由於此選項為每一行生成一個單獨的命令,因此在重新加載行時發生錯誤只會導致該行丟失,而不是整個表內容丟失。

但是,這對於我來說是可行的,希望對其他有相同問題的人有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM