【问题标题】:Restore a postgresql dump (.sql file) without the command line?在没有命令行的情况下恢复 postgresql 转储(.sql 文件)?
【发布时间】: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


【解决方案1】:

这有点难找,但经过一番调查,似乎 pg_dump 的“普通”格式(生成纯文本 SQL 文件)默认生成 COPY 命令而不是 INSERT 命令。

查看 pg_dump here 的规范,我找到了 --inserts 的选项。配置此选项将允许转储在通常会创建 COPY 命令的地方创建 INSERT 命令。

规范确实说明:

这会使恢复非常缓慢;它主要用于制作可以加载到非 PostgreSQL 数据库中的转储。但是,由于此选项会为每一行生成一个单独的命令,因此重新加载行时的错误只会导致该行丢失,而不是整个表内容。

不过,这适用于我的目的,希望能帮助其他有同样问题的人!

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2011-02-17
    • 2014-04-05
    • 2011-07-22
    相关资源
    最近更新 更多