![](/img/trans.png)
[英]Run a database dump (Restore) from an sql file in PHP + PostgreSql
[英]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.