개인 메시지를 수천 개 삭제하는 방법?

우리 커뮤니티에는 사용자들 사이에 전송된 수천 개의 개인 메시지가 있습니다. 답글이 100개 이상인 개인 메시지를 데이터베이스에서 완전히 삭제(복구 불가)하는 방법이 있을까요?

Well, I think that this will do what you asked. It will delete any private messages that were not created by a system user or discobot. It will still delete any other private messages, including those from admins.

It’s not tested. I’m not saying that it’s a good idea. I won’t promise that it won’t do something bad.

cd /var/discourse
discourse backup
./launcher enter app
rails s
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all
exit
discourse enable_restore
discourse restore

If something bad does not happen, you can omit the last two steps. If something bad does happen, you’ll want to copy/paste the most recent backup printed by the discourse restore command to restore the backup.

You can remove all message at once.

rake destroy:private_messages

Reference:

Nice work, @IAmGav! I swear i looked there and didn’t see.

Thanks Jay,
Running batch delete query directly on the database is so Scary :sweat_smile:

I took a brief look at how this function works. As it turns out, after running it, all private messages will be deleted.

  def destroy_private_messages
    Topic.where(archetype: "private_message").find_each do |pm|
      @io.puts "Destroying #{pm.slug} pm"
      first_post = pm.ordered_posts.first
      @io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
    end
  end

I think I have to choose the scary way that @pfaffman pointed out to filter messages. or try to define custom rake function and use PostDestroyer.new(Discourse.system_user, first_post).destroy

Revisiting this old topic, since none of the answers are 100% correct.

The rake task rake destroy:private_messages does not hard delete all private messages, it soft deletes them. They can still be seen by an admin and they can be recovered.

The Rails code Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all destroys the topics, but not the actual messages. They are still in the database and can be viewed using for instance the data explorer plugin.

This code will permanently delete all private message posts and topics:
warning: sharp knife here!

Post.where(topic_id: Topic.where(archetype: 'private_message').where("user_id > 0")).destroy_all
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all

(and to filter this on topics with 100 replies or more you need to extend the Topic.where with where("posts_count > 100") in both lines)