pg_restore干净表psql

时间:2017-12-07 19:00:44

标签: sql postgresql psql pg-dump pg-restore

我正在尝试恢复我转储到其当前位置的表。该表使用以下方式转储:

pg_dump -t table db > table.sql -U username

尝试恢复,我使用:

pg_restore -c --dbname=db --table=table table.sql

我正在使用-c,因为该表当前存在且具有数据,但它返回:

pg_restore: [archiver] input file appears to be a text format dump. Please use psql.

我也尝试过:

-bash-4.2$ psql -U username -d db -1 -f table.sql

但由于数据已存在且此psql命令没有--clean选项(我相信),它会返回:

psql:table.sql:32: ERROR:  relation "table" already exists

有没有办法正确使用pg_restore或者使用带有--clean选项的psql?

1 个答案:

答案 0 :(得分:1)

朋友,对你不好的消息。您不能从计划文本转储中pg_restore。它在文档中:

“pg_restore是一个实用程序,用于以非纯文本格式之一从pg_dump创建的存档中恢复PostgreSQL数据库。”https://www.postgresql.org/docs/9.6/static/app-pgrestore.html

如果您可以重新执行pg_dump,则可以使用-Fc标记执行此操作,这会产生一个可以使用pg_restore恢复的工件。如果您坚持使用纯文本格式的table.sql,那么您有几个选项(我在下面的两个示例中调用目标表my_fancy_table):

选项1:

放下桌子:drop table my_fancy_table;

现在运行你的psql命令:psql <options> -f table.sql

如果您具有参照完整性,其他表需要存在行,则可能无法删除该表。

选项2: 从临时表中升级

您可以编辑sql文件(因为它是纯文本格式)并将表名更改为my_fancy_table_temp(或任何尚不存在的表名)。现在你将有两个表,一个来自sql文件的临时表和一直在那里的真实表。然后,您可以编写一些upsert SQL来插入或更新真实表,其中包含临时表中的行,如下所示:

insert into my_facy_table (column1, column2)
select column1, column2 from my_fancy_table_temp
on conflict (my_fancy_unique_index)
update my_fancy_table
set column1 = excluded.column1,
 column2 = excluded.column2