Reset dopo l'esecuzione dello script di migrazione?

Sto usando gli script di migrazione per migrare un forum Vanilla 3 a Discourse self-hosted.

Lo script di migrazione funziona correttamente:
RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text

L’unico problema è che, una volta completata l’esportazione, non riesco a rieseguire l’importazione. Lo script di importazione viene eseguito correttamente una seconda volta, ma le modifiche ai dati apportate al file di importazione non vengono applicate. Inoltre, l’importatore viene eseguito circa 50 volte più velocemente alla seconda esecuzione, il che mi fa sospettare che non stia effettivamente importando nulla.

Domanda: c’è un modo per rieseguire gli script di importazione situati in
/var/www/discourse/script/import_scripts/
dopo la prima esecuzione?

In particolare, mentre correggo i bug nel formato del mio file di importazione, vorrei poter rieseguire l’importazione per apportare aggiornamenti solo ai post e alle discussioni.

Finora l’unica soluzione che ho trovato è stata quella di eliminare l’intera installazione di Discourse e ricominciare da capo, il che richiede quasi un’ora ogni volta.

Qualche consiglio?

Ecco il codice pertinente da 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

Sono un programmatore ma non un programmatore ruby. C’è un modo per modificare questo codice per forzarlo a sostituire il contenuto di un post se eseguo una re-importazione?

Ho trovato una soluzione non male: mentre miglioro il mio parser che ripulisce il file di importazione da Vanilla, mi concentro sugli errori che si verificano in post specifici.

Quindi, mentre miglioro il mio parser, posso fermare il parser nel debugger (sto usando Xojo, per quello che vale) e ottenere il testo grezzo.

Quindi, nel forum di discussione live, posso semplicemente aggiungere un nuovo post, incollare il testo e vedere come appare.

Questo mi permette di fare un ciclo di test/debug/modifica di pochi secondi, invece di circa un’ora.

Il mio nuovo piano: dopo che sarò soddisfatto della pulizia del mio parser, distruggerò Discourse e lo reinstallerò da zero.

Funziona così di proposito. L’idea è che puoi fare un’importazione ora e poi eseguirne un’altra con un dump fresco, che verranno eseguite molto velocemente poiché importano solo i nuovi dati.

Devi eliminare, creare ed eseguire la migrazione del database per ricominciare.

Se hai molti utenti, potresti interrompere lo script dopo l’importazione degli utenti, fare un backup e poi ripristinarlo prima di provare le tue correzioni.

1 Mi Piace

Ha perfettamente senso, grazie per la spiegazione. Sarebbe bello se ci fosse un flag che si potesse impostare per “forzare la sovrascrittura”, ma ho scavato un po’ nel codice e non ho visto nulla di ovvio.

C’è un modo semplice per farlo? L’unica soluzione che ho trovato sono questi comandi, che fondamentalmente sono gli stessi di un’installazione docker fresca:

# ATTENZIONE: questi comandi eliminano l'intero forum Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app

Ci vogliono solo circa 10 minuti, ma poi devo rifare la configurazione iniziale, il che è una seccatura.

Ora questa è un’idea fantastica! Potrei persino fare un backup dopo un’installazione fresca, ma prima di eseguire lo script di importazione, dato che reimportare utenti/argomenti/post/commenti è abbastanza veloce, e questo forum non è pubblico.

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

Devi impostare una variabile d’ambiente per eliminare il database, ma ti dirà qual è.