如何从 GUI 直接编辑 Discourse 数据库?

我正在寻找一种用户友好的实用工具,能够运行 SQL 查询,以全局整理当前包含从两个旧论坛导入的帖子和用户的数据库。例如,删除主题、为标题中包含特定字符串的所有帖子添加特定标签、删除用户,或根据用户资料是否符合某些标准来更改访问权限等。

是否有类似 phpMyAdmin 的工具可以编辑 Discourse 管理员的 SQL 备份?甚至可以直接与正在运行的 Discourse 实例配合使用?

我看到有一个插件允许在 Discourse 内部执行查询,但这似乎不允许修改数据?

4 个赞

下载备份(不含上传内容)并将其恢复到可本地查询的 PostgreSQL 实例(可通过 pgAdmin3 进行查询)是最佳方案。

6 个赞

是的,数据探索器插件不允许进行修改。但我仍建议您从它开始。您可以运行查询来确认是否存在问题,然后运行查询以筛选出需要修改的记录。这样还能避免意外破坏您的数据库。

我假设您已经在生产环境中运行。因此,在没有获得 Discourse 团队某种形式的批准之前,我非常不建议直接修改数据库。

一旦您熟悉了 Discourse 数据库并了解了问题的规模,就可以考虑进行更改的选项。您可能会发现完全可以在 Discourse 内部完成所有操作;或者如果涉及的更改很少,使用命令行也是可行的。

1 个赞

感谢 Falco!

我是一个在涉及非点击操作方面的严肃新手。

不过,我通过遵循官方指南(尽管对大部分内容并不理解),成功在 Windows 10 上搭建了一个本地的 Discourse 实例。因此,我推测应该也有类似的指南可以指导我在同一位置安装 pgAdmin3?

这个问题可能有点傻,但这个离线的 Discourse 实例是否就是我应该用来恢复导出的 SQL 文件的地方?(或者是否有其他方式可以将 Discourse 数据库备份文件恢复到 PostgreSQL?)

恢复后该如何查询呢?也就是说,我该如何将 pgAdmin3 指向正在运行的 Discourse 实例中的数据库?正在运行的 Discourse 数据库在物理上存储在哪里?Discourse 实例正在运行这一事实是否会以某种方式锁定数据库?

我在本地服务器的 ~/var/discourse 目录下的文件中,似乎找不到任何明显对应数据库的文件。

1 个赞

谢谢 Remah

我自行托管 Discourse,因此无法联系 Discourse 团队。我正在为一个小型社区搭建并运营论坛,完全基于志愿工作(即没有预算),并且正在从 MyBB 和 Yahoo Groups 论坛导入数据。其中,Yahoo Groups 导入了一些旧的自动生成的管理电子邮件通知作为主题,这些内容在当前场景下相当无关紧要。

我可能需要随着发现新问题,以零星、渐进或持续的方式进行测试并实施全局性更改,因此希望能尽量降低学习曲线,并避免依赖命令行操作!

3 个赞

我看到您的域名,第一次就查看了您的情况,所以我对您的处境有一定了解。顺便一提,我在新西兰惠灵顿,正在为几家慈善机构搭建并实际运营几个私人论坛。

鉴于您时间和经验有限,我建议先从最简单、最容易使用的工具入手,只有在迫不得已时才进入下一阶段。掌握任何超出第一层级(即仅使用 Discourse 本身)的工具都需要付出高昂代价。Discourse 若按设计使用,功能可以非常强大。

  1. Discourse 图形界面(GUI)及其您需要掌握的功能。

    • 快速熟悉 Discourse 中您必须使用的功能。您可能会发现,无需进一步深入,就能完成 99% 所需工作,因此可能根本不需要再往前一步。

    • 优先处理实际可见的问题。
      例如,您旧有的邮件通知可能并非大问题。如果它们无关紧要,Discourse 会按设计自动降低其显著性,随着更多相关主题的产生,它们会逐渐淡出视野。让论坛正常运转比解决每一个数据错误更重要。
      那么,这些自动邮件通知中有多少已被转换为论坛主题呢?

  2. Date Explorer 插件对您会很有用,它是下一步,有助于您更好地理解数据库并识别可能需要处理的问题。稍后它还能帮助您生成报告,但并非绝对必要。

    • 无法随意修改是一种安全网,因为几年前,许多用户因仓促更新而破坏了自身数据。

    • 您生成的用于识别问题记录的查询,距离直接编写 SQL 修改数据库仅一步之遥。

  3. 最终方案很可能是使用命令行和脚本来修改数据库。

    • 我宁愿承担数据显示错误数据的风险,也不愿因手动修改数据库而使其受损。这可能会埋下定时炸弹,因为某些数据损坏可能无法被及时察觉。

    • 使用 Data Explorer 生成的查询结果包含真实数据示例和可量化的记录数量。如果团队和其他专家能够理解您的数据以及您希望达成的目标,您就更有可能获得正确的解答。他们可以据此为您提供更新数据库的最简便、最安全的方法。

    • 您所需的大部分信息很可能已存在于现有主题中,因为其他网站也遇到过类似问题。因此,您只需借鉴他人来之不易的经验即可。

6 个赞

没错。就是不要直接修改数据库。总有一天你会后悔的。

7 个赞

谢谢 Remah

所有建议听起来都很合理。
如果我能说服一些用户手动扫描并标记要删除的主题,我或许可以众包一个部分解决方案。

目前,该域名上的网站基本上是一个干净的占位符,等待自由职业者完善从旧论坛的导入过程(特别是调整 MyBB 的导入脚本,以便我在那里设置的自定义用户资料字段能够随用户及其帖子一起导入。同时也希望正确解析 MyBB 帖子中的 MyCode 格式(目前这些格式代码是可见的)。

我浪费了一周时间徒劳地尝试自己完成这个导入,但无论是基于 Windows 10 的 Ubuntu 实例,还是基于 DigitalOcean 的实例,都无法按照 MyBB 导入脚本的官方指南,搭建一个包含所有前置条件的开发环境来执行导入。

在痛苦地反复尝试、解决一个又一个错误信息后,我最终在两种情况下都撞上了绝对的死胡同:在执行启动导入的最终 Ruby on Rails 命令时,无法让 SQL 数据库可访问。

Linux 和 Ruby 似乎都是由受虐狂为受虐狂编写的,两者都异常脆弱且晦涩难懂。在这样的环境中,操作数据库时发生灾难性问题的概率确实很高!

2 个赞

我表示同情。

还是继续做论坛管理员吧。:+

那个环境一直以来都缺乏用户友好性。我认为命令行比 20 年前更加重要。

但这也是我喜欢 Discourse 的原因。团队努力让 Discourse 核心功能更加友好。不幸的是,迁移是一个高门槛的技术选项。

2 个赞

几乎可以肯定,从 Rails 控制台执行这些操作会更好。

1 个赞

我想这或许取决于你对“更好”的评判标准?
就我而言,作为一个新手,最低的学习曲线以及让那些通常没有配置开发环境、对 Ruby(甚至 Linux)一无所知的人能够以最小复杂度访问系统,是重中之重。如果我有其他理由(和时间)去快速掌握这些内容,情况可能会不同……在理想世界中,应该存在某种图形界面的本地 Windows 应用程序,能够直接查询我托管在 Digital Ocean 上的 Discourse 设置……

如果您决定不直接对数据库进行修改,本主题中描述的一些命令可能会对您有所帮助:https://meta.discourse.org/t/administrative-bulk-operations/118349。例如,它详细介绍了如何从 Rails 控制台对主题进行标签操作。最重要的是,在运行任何命令之前,请务必备份您网站的数据库。

7 个赞

我对“更好”的衡量标准是“让数据库处于损坏或完全崩溃状态的可能性大大降低”。既然你只是个“新手”,当你执行某些操作时,你并不知道需要更新哪些表。

无论你采用何种方式,请确保经常进行备份。

1 个赞

这是一个合理的观点——我会首先尽力寻找其他途径。
我的无知在两种情况下都是重大风险,但说通过 Ruby 执行任何数据库更改比使用 pg Admin4 尝试相同更改更安全,这是否正确呢?

有人提到过创建不易立即察觉的损坏的风险——这两种方法中是否有任何因素会影响这种风险?

在我脑海中,如果我最终决定冒险(在已进行适当备份的前提下),我设想在 Digital Ocean 的 Droplet 上运行一个 pgAdmin4 副本,通过浏览器中的 URL 直接访问,而不是通过命令行控制台窗口,从而消除几层复杂性(我假设这是可行的)。

基本上是的。Ruby 会执行许多“魔法”操作,以确保发生正确的行为。例如,如果你从模型中销毁(删除)某个对象,它知道何时以及应该删除哪些其他内容。虽然使用原始 SQL 也能执行许多“安全”的操作,但只要有可能,我几乎总是在 Rails 中完成这些操作。

4 个赞

啊,这很有用——谢谢!

3 个赞

这看起来可能非常有用——谢谢!

2 个赞

我是如何解决“如何从 GUI 直接编辑 Discourse 数据库?”这个问题的,因为现有回答并未满足我的需求。

:warning: 请勿在生产环境中执行此操作。

本文使用的是 PostgreSQL 推荐的 admin 工具 pgAdmin 4。

此操作是在我的本地机器上进行的,目的是更深入地了解 Discourse,例如安装、配置、调优、开发插件、使用 APIwebhooks 等。

注意:Discourse 是根据《在 Windows 10 上安装 Discourse 进行开发的初学者指南》(Beginners Guide to Install Discourse on Windows 10 for Development),安装在 Windows 10 上的 WSL 2 中的 Ubuntu 18.04 系统上。

注意:WSL 2 默认不包含 systemd。参见 Issue 457

以下操作参考了《在 Ubuntu 20.04/18.04/16.04 上安装 pgAdmin 4》(Install pgAdmin 4 on Ubuntu 20.04/18.04/16.04)一文。

使用 BASH

$ echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |sudo tee  /etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
$ sudo apt update
$ sudo apt install pgadmin4 pgadmin4-apache2

pgAdmin4 用户邮箱:postgres@localhost
pgAdmin4 密码:<password 1>

$ sudo /etc/init.d/apache2 restart
$ sudo ufw allow http
$ sudo ufw allow https
$ hostname -I

记录 <address>

$ whoami

记录 <user name>

下一步可能并不需要,因为我不清楚如何获取 PostgreSQL 数据库用户的密码(我并非 PostgreSQL 专家),或者是否有其他方式为 pgadmin4 设置所需的数据库登录信息。

$ psql postgres

使用 PSQL

postgres=# ALTER ROLE <user name> '<password 2>';  

使用互联网浏览器

http://<address>/pgadmin4

用户:postgres@localhost
密码:<password 1>

启动 pgAdmin4 后

使用 pgAdmin4

创建服务器连接

标签页:常规 (General)
   名称:Discourse Development
   服务器组:Servers
标签页:连接 (Connection)
   主机:localhost
   端口:5432
   维护数据库:postgres
   用户名:<user name>
   密码:<password 2>

这并非完美方案,但确实可行,总比没有好。欢迎提供反馈和建议。


额外内容

PostgreSQL
软件目录 - 管理/开发工具

2 个赞

我发现,对于大多数操作来说,访问 Rails 控制台比直接操作数据库更简单且更安全。

或者,如果你想做的是修改用户密码(哦,这或许不是你原本想做的,但这仍然是一个很好的示例),可以执行以下命令:

cd /var/discourse
./launcher enter app
rake admin:create

尽管该 rake 任务名称如此,但它允许你执行以下操作:

  • 创建用户(即使用户已存在也没关系)
  • 修改密码(但并非必须)
  • 将用户设为管理员(但并非必须)

可以查看 管理批量操作 以获取更多示例。

以下是几个示例:

users = User.all
me = User.find_by_username('pfaffman')
me = User.find_by_email('jay@literatecomputing.com')
UserEmail.create!(user: me, email: 'myotheraddress@somewhereelse.com')
posts_with_uploads = Post.where("raw like '%upload%'")
Group.create(
  name: "mygreatgroup",
  automatic_membership_email_domains: 'literatecomputing.com',
  primary_group: true,
  title: "Literate Computing Staff",
  grant_trust_level: 4,
  flair_url: 'https://example.com/path.icon.png'
)
2 个赞

感谢反馈,这又是我需要学习的新东西。

虽然我拥有数十年的开发经验,但从未使用过 Ruby 或 Rails。我实际上是从大学时打孔卡片编程开始,个人则是从 Atari 800 开始编程的。