2015-06-01 42 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.

然而,这适合我的目的,希望能帮助其他有同样的问题!

相关问题