Reiniciar após executar script de migração?

Estou usando os scripts de migração para migrar um fórum Vanilla 3 para Discourse auto-hospedado.

O script de migração está funcionando bem:
RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text

O único problema é que, depois de fazer a exportação, não consigo reimportar novamente. O script de importação é executado bem pela segunda vez, mas quaisquer alterações de dados que fiz no arquivo de importação não são aplicadas. Além disso, o importador é cerca de 50 vezes mais rápido na segunda execução, o que me faz suspeitar que ele não está realmente importando nada.

Pergunta: existe alguma maneira de reexecutar os scripts de importação localizados em
/var/www/discourse/script/import_scripts/
após a primeira execução?

Especificamente, à medida que corrijo bugs no formato do meu arquivo de importação, gostaria de poder reimportar para que as atualizações sejam feitas apenas em posts e discussões.

Até agora, a única solução que encontrei foi destruir toda a instalação do Discourse e começar do zero, o que leva quase uma hora cada vez.

Alguma dica?

Aqui está o código relevante de 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

Sou programador, mas não programador ruby - existe alguma maneira de modificar este código para forçá-lo a substituir o conteúdo de um post se eu fizer uma reimportação?

Encontrei uma solução alternativa que não é nada mal - à medida que melhoro meu parser que limpa o arquivo de importação do Vanilla, foco em erros que ocorrem em posts específicos.

Portanto, à medida que melhoro meu parser, posso parar o parser no depurador (estou usando Xojo, para que valha a pena) e obter o Texto Bruto.

Então, no fórum do Discourse ativo, posso simplesmente adicionar um novo post, colar o texto e ver como fica.

Isso me permite fazer um ciclo de teste/depuração/alteração de alguns segundos, em vez de cerca de uma hora.

Meu novo plano: depois que eu estiver satisfeito com a limpeza do meu parser, então eu vou destruir o Discourse e reinstalar do zero.

Funciona assim de propósito. A ideia é que você pode fazer uma importação agora e depois executar outra com um dump novo, elas rodarão muito rápido, pois importam apenas os novos dados.

Você precisa remover, criar e migrar o banco de dados para recomeçar.

Se você tiver muitos usuários, pode parar o script depois que os usuários forem importados e fazer um backup, depois restaurar esse backup antes de tentar suas correções.

1 curtida

Isso faz todo o sentido, obrigado por explicar. Seria bom se houvesse uma flag que pudesse ser definida para “forçar sobrescrita”, mas eu vasculhei o código um pouco e não vi nada óbvio.

Existe uma maneira fácil de fazer isso? A única solução que encontrei são esses comandos, que basicamente são os mesmos que iniciar uma nova instalação do docker:

# ATENÇÃO: estes comandos excluem todo o seu fórum Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app

Leva apenas cerca de 10 minutos, mas depois tenho que passar pela configuração inicial novamente, o que é uma chatice.

Agora essa é uma ideia fantástica! Eu poderia até mesmo fazer um backup após uma nova instalação, mas antes de executar o script de importação, já que reimportar usuários/tópicos/posts/comentários é bem rápido, e este fórum não está ativo para o público.

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

Você tem que definir uma variável de ambiente para descartar o banco de dados, mas ele lhe dirá qual é.