如何在纯 SQL 中创建新用户

创建用户并使其在 Discourse 中显示为活跃状态,最少需要向哪些表添加行?

我刚刚在 user_emails 表中插入了一行:

insert into user_emails (user_id, email, "primary", created_at, updated_at) values (2,'user@email.com',true, now(), now());

不出所料,该用户在 GUI 中并未出现。那么最少需要执行哪些步骤?我是否需要向更多表添加数据,或者需要重启某些服务?

现在可能有人会说这不是正确的做法,我理解这一点。但对我而言,情况可能如下(我的一些假设可能不正确,但这是我的理解):

  • 所有从其他数据库论坛导入数据的脚本都期望能够从 Discourse 实例连接到另一个论坛。然而,让正在运行的 Discourse 实例访问另一个论坛(jforum)可能非常困难甚至不可能;同样,尝试安装一个包含旧论坛(位于非常旧的服务器上)的 Discourse 开发环境也是不可行的。
  • 我不熟悉 Ruby on Rails,因此无法修改现有脚本,但我懂 SQL。
  • 我可以使用 API(我只有 5000 个用户),但我希望有一种插件或方法能够保留 MD5 密码哈希,而不要求所有用户重置密码,因此我认为无法通过 API 实现这一点。
  • 存在一个 jforum 导入脚本,我可以利用它来查看从 jforum 提取数据所需的 SQL,然后将其放入 CSV 文件并加载到数据库中。
  • 批量导入工具可能提供了向 Discourse 添加 SQL 数据的方法,但我难以找到相关的 SQL 语句。
  • 看起来,关键是将用户导入系统,之后添加分类、主题和帖子应该不会太困难。

没错!

如果你真的理解,就不会来问了。:wink:

你最终导致数据库损坏的可能性相当高。到时候,谁也帮不了你。

请导出你的数据库,并在本地 Discourse 服务器(或任何能连接到的地方——我曾通过家庭互联网连接远程数据库完成过更大的导入)上恢复,然后运行现有的脚本。

使用你并不完全理解的 Ruby,要比为了弄明白如何编写 SQL 而去深入理解 Ruby 容易得多。我是在编写第一个导入器很久之后才学习 Ruby 的。

这有点居高临下!
如果批量导入脚本正在运行 SQL(我认为是这样),那么记录创建用户所需的 SQL 语句,其风险并不比直接使用批量导入脚本更大。况且,我目前安装的是原生版 Discourse,就算搞砸了也无伤大雅。我在开发方面的经验应该比你丰富得多。

我不太熟悉的是各种管理任务。我第一次尝试在本地安装 Discourse 服务器就惹来了一堆麻烦。如果我的 Discourse 服务器无法连接到我的 JForum MySQL 服务器,我就还得安装 MySQL 并迁移数据库。现有的 JForum 脚本并未纳入主源代码树,而且我使用的是非常旧版本的 JForum,所以并不指望它能直接工作。

我并无冒犯之意。我想你漏看了那个:wink: 表情?

我相信你说得对!

有时候,来自一位全职使用 Discourse 超过三年、完成过数十次数据导入、并从头编写过多个导入工具的人的免费建议,其价值远超你付出的代价。

设置 SSH 隧道怎么样?

也许是不一致,但并非损坏。

但你可以通过 API 创建用户,然后使用 SQL 将 md5 哈希插入到自定义字段中。这样你可以兼得两者之利。

哦!这真是个不错的主意。

这就是你在寻找的免费建议!

是的,我确实有过这个想法,但因为我不是很清楚 MD5 哈希的工作原理,所以不确定这是否可行。好的,我会尝试一下。

你只需插入一个自定义字段:

  • user_id:显而易见
  • name:“import_pass”
  • value:MD5 摘要

然后安装 migratepassword 插件。

谢谢,我有几个问题,希望能得到您的帮助。

安装

在 Discourse 目录下运行 bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com)(原 DiscourseHosting)/discourse-migratepassword
重启 Discourse
  1. 我已经安装了插件,但该如何重启 Discourse?

  2. 如何插入自定义字段?能否提供 SQL 语句?或者是否可以通过 API 使用 "user_fields[1]": "string" 部分来完成?目前我可以通过 API 编程方式创建用户,但暂时忽略了该字段。

  3. 如果已安装该插件,在通过 API 创建用户时传入的密码值是否无关紧要?

  1. 不,它将覆盖自定义字段中的 MD5 摘要。

其他两个问题的答案可以在本论坛轻松找到。如果您想节省时间,我们可以作为付费服务为您执行导入和/或托管。

我搜索了两个答案,但都没找到。第一种情况令人困惑:有些安装是通过编辑 YAML 文件然后重启 Docker 完成的,而有些(如本例)似乎是在 Docker 容器内完成的。这种情况下“重启”具体指什么并不清楚。

在这个论坛里,我实在找不到任何纯 SQL 的内容。

令人惊讶的是,这里似乎大力推销付费服务以使用这款开源软件。当我在 Stack Overflow 上提问时,从未遇到过这种情况。

我喜欢一起思考、创新和贡献。但我也需要谋生,这意味着我需要在某个地方划清界限,而我尝试将界限划在我感觉自己是在工作而不是在思考、创新和贡献的地方。

查找用户自定义字段的 SQL 查询对我来说就是工作,既然你是一位经验丰富的开发者,我相信你也能搞定 :smiley:

当然,我可以尝试自己解决,但既然这

并非轻易能在本论坛找到

问一问也无妨。至于另一个问题,我仍然不太清楚。

我并不指望你替我完成工作,但另一方面,我确实常常感到沮丧,因为文档往往对用户预设了太多前提。

好的,问题 2:为用户 ID 5 添加自定义 import_pass 字段的示例(用户 ID 可在 user_emails 表中查看,或从 users 表中获取 id)

insert into user_custom_fields (user_id, name, value, created_at, updated_at) values (5,‘import_pass’,‘2aee1c40222c7754d4534e61452612cc’, now(), now());

好的,我找到了。
./launcher restart app
但似乎没有重启。我可以进入应用并连接数据库,但无法连接到网站。也许只需重建并重新开始。

所以我运行了 ./launcher rebuild app,现在它又恢复正常并可以工作了。

我原以为这会重建数据库,但实际上并没有。我想这是因为实际数据库存储在 Docker 之外,而 rebuild 只是重建 Docker 应用。另外,我看到我添加的 dataexplorer 插件(通过修改 yaml 文件)仍然在那里。但是 passwordmigration 插件还在吗?还是说它会被 rebuild 清除?在管理页面的插件部分确实没有任何相关显示。

好的,我尝试安装了 passwordmigration,然后再次运行 restart,结果我的网站又无法访问了。看起来 passwordmigration 似乎破坏了某些东西?

于是我再次重建,让它恢复了工作(但现在 passwordmigration 插件不见了)。如果我在没有先安装 migrationpassword 的情况下运行 ./launcher restart app,重启是正常的,所以看起来在我的环境中,migrationpassword 确实存在特定问题。

上次我尝试时,passwordmigration 插件与运行导入操作不兼容,因此建议在完成导入后再安装该插件。

它可能会导致您的重建失败,但这相当令人意外,因为 Richard 在他的托管环境中使用了该插件。我建议在完成导入后,像安装 data explorer 一样,在 app.yml 中安装该插件。

如果您想获取一个新的数据库,请执行 rm -rf 删除 /var/discourse/shared/standalone 下的 postgres 目录。或许您可以查看 https://meta.discourse.org/t/advanced-troubleshooting-with-docker/15927

在导入期间禁用它应该就足够了。

奇怪,我删除了数据库并运行了 ./discourse-setup,因此得到了一个全新的安装,一切正常。

通过 rake 安装了 migrationpassword 并重启后,网站再次出现 502 错误!

DataExplorer 插件仍然存在,于是我将其移除并重建,一切正常;随后重新安装 migrationpassword,却又再次出现 502 错误。

这令人非常困惑,因为显然其他人能正常使用,但在我的原生安装中却无法工作。

接下来我将尝试通过编辑 app.yml 文件来进行安装。

(圣诞购物耽误了时间)但我终于尝试通过编辑 app.yml 并重新构建来安装 migratepassword……成功了!
不过,bundle exec rake plugin:install repo=http://github.com/[Communiteq](https://www.communiteq.com) (formerly DiscourseHosting)/discourse-migratepassword 这个选项在我的标准安装环境中无法使用。或许需要在 GitHub - communiteq/discourse-migratepassword: Support migrated password hashes · GitHub 的 README.md 中对此进行检查或移除。