执行迁移脚本后重置?

我正在使用迁移脚本将 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 并从头开始重新安装。

它就是这样工作的。这样做的目的是您可以先进行一次导入,然后使用新的转储再次运行,它们将运行得非常快,因为它们只导入新数据。

您需要删除、创建和迁移数据库才能重新开始。

如果您有很多用户,可以在导入用户后停止脚本,然后进行备份,然后在尝试修复之前恢复该备份。

1 个赞

这完全说得通,谢谢你的解释。如果有一个可以设置的“强制覆盖”标志就好了,但我稍微看了一下代码,没有发现明显的东西。

有没有简单的方法可以做到这一点?我找到的唯一解决方案是这些命令,它们基本上与启动一个新的 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

您必须设置一个环境变量来删除数据库,但它会告诉您是什么。