我是postgresql的新手,需要在php中构建自定义备份和恢复脚本。从这里的阅读帖子中,我了解到psql -E
将输出到终端的sql用于\ postgg用于描述序列,表格,视图等。
我无法弄清楚我可以在我的工作中复制sql语句是如何组合2个或更多sql语句来实现最终结果。例如,\d mytable
将输出表的结构,我可以使用该表为备份脚本创建CREATE TABLE脚本。这需要4个查询。是否有一套方法来获取这些查询并将它们组合起来?
答案 0 :(得分:1)
您不希望使用psql
的信息查询(\ commands
)。您需要的是pg_dump
,而不是psql
。 psql
向您展示了一个关于表格外观的人类可读视图; 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目录不保证在版本之间保持稳定 - psql
和pg_dump
等工具以及information_schema
通常会保护您免受此类更改。如果你在目录中钻研,那么每次有一个重要的版本发布时你都要重新测试,并处理任何向后的compat中断。请查看pg_dump
中所有特定于版本的案例,以了解您自己所处的内容。
我认为这很糟糕,pg_dump
的核心功能应该在libpqdump
或服务器端扩展中,但遗憾的是它不是,并且没有人愿意这样做为实现这一目标所需的大量工作。
简短版:只需使用pg_dump
即可。如果需要,它支持-t
等选择性转储选项。