2014-01-20 38 views
0

我是一个相当新的postgresql,需要在php中构建自定义备份和还原脚本。从阅读这里的帖子,我了解到psql -E这将输出到终端SQL为一个\命令postgres用来描述一个序列,表,视图等
我不能弄清楚,以便我可以复制sql我的工作中的语句是如何组合2个或更多的sql语句以实现最终结果。例如,\d mytable将输出可用于为备份脚本创建CREATE TABLE脚本的表的结构。这需要4个查询。是否有一套方法可以将这些查询合并起来?揭秘postgresql 内部查询

+0

你问的是如何从PHP执行'psql -E',如何解析'psql'的输出,如何生成'CREATE TABLE'语句或以上都不是? –

+0

我在问如何在斜杠命令('\ d mytable')中显示任何一组查询'psql -E',这样我就可以理解它在php代码中的使用。对于如何使用或链接在一起的两个或多个查询,必须有某种逻辑。它们不是子查询。它们是否起作用? – dwlamb

回答

1

你不想使用psql的信息查询(\ commands)。你需要的是pg_dump,而不是psqlpsql向您展示了表格外观的人类可读视图; pg_dump为您提供了DDL重新创建它,这是你说你想要的,因为你正在试图创建一个“备份脚本”。

不幸的是,目前pg_dump不是真的可以作为库调用,并且提取它的查询并不简单。相反,您通常需要调用pg_dump作为shell命令。

对于视图,您可以使用SQL函数SELECT pg_get_viewdef('view_name')。不幸的是,对于表或其他数据库对象没有等价物。请参阅system information functions

psql一样,pg_dump可能会使用一系列查询为给定命令构造SQL文本。你可以找到pg_dump如何构建这些在source code for pg_dump,特别是可怕的pg_dump.c。见dumpTable() for instance

请注意,如果您尝试复制pg_dump如何复制它,您将为自己创建一个维护噩梦。请记住,PostgreSQL目录并不保证从版本到版本稳定 - 类似psqlpg_dumpinformation_schema等工具通常可以保护您免受此类更改。如果您深入研究目录,那么每次发布主要版本时都必须重新测试,并处理任何落后的compat中断。看看pg_dump中的所有特定于版本的案例,了解自己的想法。

我觉得这很烂,那的pg_dump核心功能应该在libpqdump或在服务器端扩展,但遗憾的是它没有了,没有人愿意做,使所需的大量工作那可能。

简短版本:只需使用pg_dump。它支持选择性转储选项,如-t,如果你需要它们。

+1

+1我很确定这是OP想要的,尽管他否认这一点。这是一个经典的[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)恕我直言。 –

+0

@ÁlvaroG.VicarioHuh,我不知道这个谬误有一个名字。我通常会写(当我可以被打扰的时候),比如“请解释* why * this * how *;你试图解决的根本问题是什么,而不是你认为你应该如何解决它。“ –

+0

@CraigRinger。如果使用pg_dump是一个选项,我不会试图编写自己的和恢复备份脚本来通过浏览器操作数据库。我用于生产/托管的ISP有一个非常有限的界面只有PhpPgAdmin。在我的开发方面使用pg_dump是可以的,但是我们已经查看了开关和选项来缩小它,但是它仍然会生成一个需要大量编辑的转储文件,然后我才能够轻松地复制并粘贴到PhpPgAdmin查询textarea中。一个用CREATE TABLE语句查询要重建的元素的方法 – dwlamb