Zurücksetzen nach Ausführen des Migrationsskripts?

Ich verwende die Migrationsskripte, um ein Vanilla 3 Forum nach selbst gehostetem Discourse zu migrieren.
Das Migrationsskript funktioniert einwandfrei:
RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text

Das einzige Problem ist, dass ich nach dem Export die Daten nicht erneut importieren kann. Das Importskript läuft beim zweiten Mal einwandfrei, aber alle Datenänderungen, die ich an der Importdatei vorgenommen habe, werden nicht übernommen. Außerdem läuft der Importer beim zweiten Mal etwa 50x schneller, was mich vermuten lässt, dass er tatsächlich nichts importiert.

Frage: Gibt es eine Möglichkeit, die Importskripte unter
/var/www/discourse/script/import_scripts/
nach dem ersten Durchlauf erneut auszuführen?

Insbesondere möchte ich, während ich Fehler in meinem Importdateiformat behebe, die Möglichkeit haben, erneut zu importieren, um nur Aktualisierungen an Beiträgen und Diskussionen vorzunehmen.

Bisher war die einzige Lösung, die ich gefunden habe, die gesamte Discourse-Installation zu löschen und von vorne zu beginnen, was jedes Mal fast eine Stunde dauert.

Irgendwelche Tipps?

Hier ist der relevante Code aus 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

Ich bin Programmierer, aber kein Ruby-Programmierer - gibt es eine Möglichkeit, diesen Code zu ändern, um den Inhalt eines Beitrags zu ersetzen, wenn ich einen erneuten Import durchführe?

Ich habe einen Workaround gefunden, der nicht schlecht ist – während ich meinen Parser verbessere, der die Importdatei von Vanilla bereinigt, konzentriere ich mich auf Fehler, die in bestimmten Beiträgen auftreten.

Wenn ich also meinen Parser verbessere, kann ich den Parser im Debugger anhalten (ich benutze Xojo, falls es das wert ist) und den Rohtext erhalten.

Dann kann ich im Live-Discourse-Forum einfach einen neuen Beitrag hinzufügen, den Text einfügen und sehen, wie er aussieht.

Dies ermöglicht mir einen Test-/Debug-/Änderungszyklus von wenigen Sekunden anstatt von etwa einer Stunde.

Mein neuer Plan: Nachdem ich mit der Bereinigung meines Parsers zufrieden bin, werde ich Discourse löschen und von Grund auf neu installieren.

Es funktioniert absichtlich so. Die Idee ist, dass Sie jetzt einen Import durchführen und dann einen weiteren mit einem frischen Dump ausführen können. Dieser wird sehr schnell laufen, da nur die neuen Daten importiert werden.

Sie müssen die Datenbank löschen, neu erstellen und migrieren, um neu zu beginnen.

Wenn Sie viele Benutzer haben, könnten Sie das Skript stoppen, nachdem die Benutzer importiert wurden, dann ein Backup erstellen und dieses Backup wiederherstellen, bevor Sie Ihre Korrekturen versuchen.

1 „Gefällt mir“

Das ergibt vollkommen Sinn, danke für die Erklärung. Es wäre schön, wenn es ein Flag gäbe, das man auf „Überschreiben erzwingen“ setzen könnte, aber ich habe den Code ein wenig durchsucht und nichts Offensichtliches gefunden.

Gibt es dafür eine einfache Möglichkeit? Die einzige Lösung, die ich gefunden habe, sind diese Befehle, die im Grunde dasselbe sind wie eine neue Docker-Installation:

# ACHTUNG: Diese Befehle löschen Ihr gesamtes Discourse-Forum
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app

Es dauert nur etwa 10 Minuten, aber dann muss ich die Ersteinrichtung wiederholen, was mühsam ist.

Das ist eine fantastische Idee! Ich könnte sogar ein Backup nach einer Neuinstallation erstellen, aber bevor ich überhaupt das Import-Skript ausführe, da das erneute Importieren von Benutzern/Themen/Posts/Kommentaren ziemlich schnell geht und dieses Forum nicht öffentlich zugänglich ist.

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

Sie müssen eine Umgebungsvariable festlegen, um die Datenbank zu löschen, aber sie wird Ihnen sagen, welche das ist.