揭开postgresql \ internal查询的神秘面纱

时间:2014-01-20 15:19:14

标签: php psql

我是postgresql的新手,需要在php中构建自定义备份和恢复脚本。从这里的阅读帖子中,我了解到psql -E将输出到终端的sql用于\ postgg用于描述序列,表格,视图等。 我无法弄清楚我可以在我的工作中复制sql语句是如何组合2个或更多sql语句来实现最终结果。例如,\d mytable将输出表的结构,我可以使用该表为备份脚本创建CREATE TABLE脚本。这需要4个查询。是否有一套方法来获取这些查询并将它们组合起来?

1 个答案:

答案 0 :(得分: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文本。您可以在source code for pg_dump中找到pg_dump如何构建这些内容,特别是怪异的pg_dump.c。请参阅dumpTable() for instance

请注意,如果您尝试复制pg_dump的工作方式,您将为自己制造维护噩梦。请记住,PostgreSQL目录不保证在版本之间保持稳定 - psqlpg_dump等工具以及information_schema通常会保护您免受此类更改。如果你在目录中钻研,那么每次有一个重要的版本发布时你都要重新测试,并处理任何向后的compat中断。请查看pg_dump中所有特定于版本的案例,以了解您自己所处的内容。

我认为这很糟糕,pg_dump的核心功能应该在libpqdump或服务器端扩展中,但遗憾的是它不是,并且没有人愿意这样做为实现这一目标所需的大量工作。

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