【发布时间】:2015-06-01 09:00:45
【问题描述】:
场景:
我已经构建了一个使用 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...
【问题讨论】:
-
如果它是一个实际的 SQL 转储(而不是,例如,pg_dump 的自定义格式),您可以只在数据库中运行查询
-
我最初的想法是一样的。我已经尝试过使用 .sql 文件,但正是该 COPY 语句和数据格式导致了问题。可能是因为我使用的是 pgAdmin III 吗?以上是你指的pg_dump的自定义格式吗?我在上面添加了一个示例。
-
看起来它需要来自标准输入的数据,但我怀疑你可以从 PHP 调用 dup。尝试重写文件以插入值
-
是的,我也测试过。插入按您的预期工作。进一步研究一下,pgAdmin III 正在使用“p”格式(纯文本)执行 pg_dump,它声明它生成一个纯文本 SQL 文件。我没有看到任何允许我将这些 COPY 命令更改为 INSERT 命令的选项...看起来我可能需要为此找到一个自定义解决方案?
标签: php postgresql