Сброс после запуска скрипта миграции?

Я использую скрипты миграции для переноса форума Vanilla 3 на самостоятельно размещённый Discourse.

Скрипт миграции работает корректно:
RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text

Единственная проблема в том, что после экспорта я не могу выполнить повторный импорт. Скрипт импорта успешно запускается во второй раз, но любые изменения данных, внесённые в файл импорта, не применяются. Кроме того, импорттер работает примерно в 50 раз быстрее при втором запуске, что заставляет меня подозревать, что на самом деле ничего не импортируется.

Вопрос: есть ли способ повторно запустить скрипты импорта, расположенные в
/var/www/discourse/script/import_scripts/
после первого запуска?

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

На данный момент единственным найденным решением было полностью удалить установку Discourse и начать заново, что занимает почти час каждый раз.

Есть ли какие-либо советы?

Вот соответствующий код из vanilla.rb:

  def import_posts
    puts "", "importing posts..."

    create_posts(@comments) do |comment|
      next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id])

      {
        id: "comment#" + comment[:comment_id],
        user_id:
          user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID,
        topic_id: t[:topic_id],
        raw: clean_up(comment[:body]),
        created_at: parse_date(comment[:date_inserted]),
      }
    end
  end

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

Я нашёл один рабочий вариант, который вполне приемлем. По мере того как я улучшаю свой парсер, который очищает файл импорта из Vanilla, я обычно сосредотачиваюсь на ошибках, возникающих в конкретных постах.

Так что, когда я дорабатываю парсер, могу остановить его в отладчике (кстати, я использую Xojo) и получить исходный текст.

Затем, в живом форуме Discourse, я просто создаю новый пост, вставляю туда текст и смотрю, как это выглядит.

Это позволяет мне проходить цикл тестирования/отладки/изменения за несколько секунд, а не за час или около того.

Мой новый план: когда я буду доволен очисткой, выполненной моим парсером, я удалю Discourse и установлю его заново с нуля.

Это работает так намеренно. Смысл в том, что вы можете выполнить импорт сейчас, а затем запустить его снова с новым дампом — это будет происходить очень быстро, так как импортируются только новые данные.

Чтобы начать заново, необходимо удалить, создать и выполнить миграцию базы данных.

Если у вас много пользователей, вы можете остановить скрипт после импорта пользователей, сделать резервную копию, а затем восстановить эту копию перед тем, как применять исправления.

Это имеет полный смысл, спасибо за объяснение. Было бы неплохо, если бы существовал флаг, который можно установить для «принудительного перезаписывания», но я немного изучил код и не нашел ничего очевидного.

Есть ли простой способ сделать это? Единственное решение, которое я нашел, — это следующие команды, которые по сути аналогичны чистой установке Docker:

# ВНИМАНИЕ: эти команды удаляют весь ваш форум Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app

Это занимает около 10 минут, но затем мне приходится снова проходить начальную настройку, что довольно утомительно.

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

sv stop unicorn
rake db:drop db:create db:migrate

Чтобы удалить базу данных, необходимо установить переменную окружения, но система сообщит, какая именно.