我正在尝试还原我将其倒入当前位置的桌子。该表是使用以下方式倾倒的:
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或将PSQL与 - 清洁选项使用?
朋友,朋友。您不能从计划文本转储中 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:从温度表
upsert您可以编辑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