pg_restore очистить таблицу psql

Я пытаюсь восстановить таблицу, которую я сбросил, в ее текущее местоположение. Таблица была выгружена с использованием:

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 с параметром --clean?


person Taylor F    schedule 07.12.2017    source источник
comment
Поскольку вы все равно собирались выполнить -c, есть ли причина, по которой вы не можете просто удалить таблицу вручную и выполнить свой psql <options> -f table.sql после того, как таблица исчезнет?   -  person bbuckley123    schedule 07.12.2017
comment
Полагаю, я мог бы? Будет ли это испортить какие-либо другие подключенные таблицы?   -  person Taylor F    schedule 07.12.2017


Ответы (1)


Плохие новости для тебя, друг. Вы не можете pg_restore из дампа текста плана. Это в документации:

«Pg_restore - это утилита для восстановления базы данных PostgreSQL из архива, созданного pg_dump в одном из непростых текстовых форматов». 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
person bbuckley123    schedule 07.12.2017
comment
Спасибо за исчерпывающий ответ! Похоже, упущение -FC было моей неудачей. Позвольте мне попробовать вариант 2. - person Taylor F; 07.12.2017