Как pg_restore только таблицы в Rails schema.rb

У меня есть файл дампа pg и приложение Rails с пустыми таблицами. Мне нужно восстановить дамп ТОЛЬКО В ТАБЛИЦЫ, КОТОРЫЕ УЖЕ СУЩЕСТВУЮТ (которые есть в schema.rb).

Проблема с параметрами --data-only --disable-triggers для pg_restore заключается в том, что при нарушении ссылочной целостности, например. при попытке заполнить дочернюю таблицу до того, как существуют ее родительские записи, данные не заполняются.

В качестве альтернативы, используя параметры --if-exists --clean, он создает новые таблицы в базе данных для всего в файле дампа. (Теперь я понимаю, что --if-exists просто означает сначала удалить любую существующую таблицу перед заполнением, это не предотвращает создание новых таблиц)

Насколько я понимаю параметры pg_restore, это невозможно. Если да, то есть ли способ удалить в базе данных все таблицы, которые не указаны в списке schema.rb? Либо через приложение Rails, либо из Linux (SSM подключается к AWS EC2, подключенному к RDS)? Это позволило бы мне запустить pg_restore, а затем удалить лишние таблицы.

Спасибо!


person rigyt    schedule 02.02.2020    source источник
comment
Вы можете использовать опции -l и -L для pg_dump и pg_restore, учитывая необходимость выполнения определенных операций синтаксического анализа.   -  person Jean-Michel Gigault    schedule 02.02.2020
comment
Хорошо, спасибо. Все выглядит немного устрашающе для меня. Я попробую сценарий ruby, чтобы удалить таблицы, не входящие в белый список.   -  person rigyt    schedule 03.02.2020


Ответы (1)


Я только что прошел через это, и вот как я этого добился. Я взял файл дампа и создал отдельный файл дампа только для нужной мне таблицы, а затем импортировал его.

Итак, команда для создания файла дампа таблицы

pg_restore --data-only --table=tablename fulldumpfilename.dump > onetablefilename.dump

Расширения файлов также могут быть pg, кажется, у меня было .dump, поэтому я сохранил это для нового файла. Также настройте пути, чтобы они соответствовали местоположению ваших файлов.

Затем вы можете импортировать эту таблицу с помощью обычной команды

psql destdb < onetablefilename.dump

Возможно, это не лучшее решение, если у вас много таблиц, у меня их было всего несколько, и это позволило мне извлечь их, импортировать, а также контролировать порядок их ввода.

person Rockwell Rice    schedule 02.02.2020
comment
У меня есть куча таблиц, да. pg_restore ведет себя по-другому, если я перечисляю таблицы как параметры -t, поэтому на данный момент я должен придерживаться загрузки всех таблиц. - person rigyt; 03.02.2020