我们的论坛上有几百名用户,他们的姓名(不是用户名,是姓名)由于外部 SSO 提供商(通过 WordPress)在创建账户时的设置问题,被意外设置成了他们的电子邮件地址。
有没有一种相对简单的方法可以批量将这些姓名从 the_name@example.com 更改为 the_name(即截断“@”之后的所有内容),而无需逐个手动进入每个配置文件进行修改?
我们的论坛上有几百名用户,他们的姓名(不是用户名,是姓名)由于外部 SSO 提供商(通过 WordPress)在创建账户时的设置问题,被意外设置成了他们的电子邮件地址。
有没有一种相对简单的方法可以批量将这些姓名从 the_name@example.com 更改为 the_name(即截断“@”之后的所有内容),而无需逐个手动进入每个配置文件进行修改?
你可以在 Rails 控制台中操作。这比在这里能解释的要复杂得多,尤其是因为电子邮件地址已不再存储在用户记录中。如果你有预算,可以在 Marketplace 频道发帖或直接联系我。
或者,如果你并不在意实际的电子邮件地址……
类似这样:
users = User.where('username like ?', '%@%')
然后遍历结果,使用 gsub 将 @ 及其后面的所有内容移除。这是我能在手机上提供的最佳方案。
感谢回复 @pfaffman。我可以编写 SQL,但在 Rails 控制台中操作对我来说有点超出我的专长范围。我该如何进入 Discourse 的 Python 控制台呢?![]()
如果能有一个类似数据浏览器的工具,允许你编写 UPDATE 查询就好了——虽然我也明白这可能存在潜在风险。
有人知道是否有办法将第三方 SQL 工具(如 Sequel Pro 或同类工具)连接到自托管 Docker 版 Discourse 的运行中数据库吗?
是的,但在 Rails 中操作会让数据库出错的风险大大降低。比如,如果你用 Rails 操作,你会知道没有创建非法的用户名(而且如果修改某个表时需要更新其他相关表,Rails 会自动处理,而 SQL 不会)。
cd /var/discourse
./launcher enter app
rails c
现在你已经进入 Rails 环境了。
users=User.where("username like '%@%'")
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "新名称:#{user.name}"
# user.save
end
我认为这应该能达到你的目的。如果看起来可行,你可以取消注释 user.save 然后试试看。
先做个备份,好吗?(或者更好的做法是在测试服务器上操作。)
哇,太感谢你的代码了!
我这个 Discourse 实例没有测试服务器,但我可以做个备份,然后在明天凌晨流量很少(或几乎没有)的时候运行代码。这样如果出现问题,我可以立即恢复。
非常感谢 @pfaffman。
如果 puts 看起来没问题,那应该挺安全的。祝好!
在 @ 处截断仍然会让个人信息(电子邮件地址)在很大程度上对“大坏互联网”可见(鉴于大多数人使用的是 @gmail.com 或少数其他大型提供商)。您可能最好将其设置为与用户名相同的值。
感谢 @lionel-rowe,这是一个很好的观点。不过用户名已经是这个相同的值了(用户名是通过从用户电子邮件地址中提取 ‘@’ 之前的所有内容创建的)。
太可怕了。
我不得不对代码进行一点小修改,并添加一个小过程来使其正常工作。这是修改后的代码:
users=User.where("name like '%@%'")
然后 Rails 控制台开始通过“more”命令向你展示用户数据,所以我需要输入 q 退出。接着:
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "新名称:#{user.name}"
# user.save
end
随后 Rails 控制台向我展示了新名称的列表(正确!),然后再次进入用户的“more”模式。再次输入 q 退出。
接着:
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "新名称:#{user.name}"
user.save
end
……不再有包含电子邮件地址的用户名,论坛前端一切正常。
再次感谢 @pfaffman 的慷慨帮助。