PostgreSQL 10中从视图中进行的pg_dump没有数据

9

pg_dump --table=export_view --data-only --column-inserts mydb > export_view.sql

这是一个用于导出PostgreSQL数据库中名为mydb的表export_view的命令。使用--data-only参数只导出数据,--column-inserts参数将生成INSERT语句包含列名。最终导出的数据将保存在export_view.sql文件中。

pg_dump(PostgreSQL)10.7(Ubuntu 10.7-1.pgdg18.04+1)

从PostgreSQL表中导出特定行作为INSERT SQL脚本以及postgresql文档(https://www.postgresql.org/docs/10/app-pgdump.html)建议可以使用--table标志从视图中pg_dump。如果我直接从表中导出,我会得到预期的结果(即,数据已导出)。如果我在psql中从视图中选择,我也会得到预期的结果。但是,无论我创建视图还是材料化视图,然后尝试pg_dump,我只得到正常的pg_dump头部而没有数据。评论者(https://stackoverflow.com/users/2036135/poshest)在上面的SO问题中似乎也遇到了同样的问题,但没有给出解决方案。

如果我使用CREATE TABLE blah AS SELECT x, y, z FROM MYTABLE,那么我可以成功导出。如果我使用CREATE VIEW blah AS SELECT x, y, z FROM MYTABLE,那么导出的内容为空。我做错了什么?
2个回答

4

正如@bugmenot所指出的那样, 版本13(及以上版本)- 在撰写本答案时的当前版本 - 确实对要转储的内容进行了澄清

除了表之外,此选项还可用于转储匹配视图、材料化视图、外部表和序列的定义它不会转储视图或材料化视图的内容,只有在使用--include-foreign-data指定相应的外部服务器时,才会转储外部表的内容。

(强调已添加)。

因此,答案(对我自己而言)是:“你没有做错任何事,除了错误解释Postgres <=12的文档。你想做的事情是不可能的。”


1

视图不存储数据,它们提供对数据的动态视图。当您在转储中包含视图时,您只会得到视图定义。


谢谢,我知道什么是视图(虽然“材料化视图”实际上会存储数据,因此如果你想要从教育角度出发,你应该将这一限制包括在内)。但是从逻辑上讲,“pg_dump”无法包括来自于调用视图的结果数据,这完全没有任何逻辑原因,而且所引用的文档也没有明确说明这一点。 - AntonOfTheWoods
不是故意听起来傲慢,如果那样的话很抱歉。混淆似乎在于pg_dump正在转储什么以及数据库“是”什么。顺便说一下,最新版本的文档已经有了关于视图的说明:https://www.postgresql.org/docs/current/app-pgdump.html - bugmenot123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接