Bulk remove users

I have imported my old data from phpBB3 which went smooth. But I made a mistake by not first cleaning up the old inactive users and still importing them. I now have around 4000 users with no posts I wish to remove.

What is the best way to bulk remove users?

If you really don’t care about these users, then I would do this

  1. make a backup (better safe than sorry)
  2. ssh into your server and type
cd /var/discourse
./launcher enter app
rails c
User.where(post_count: 0).destroy_all
2 « J'aime »

These instructions produce the following error:
[1] pry(main)> User.where(post_count: 0).destroy_all ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column users.post_count does not exist LINE 1: SELECT "users".* FROM "users" WHERE "users"."post_count" = 0 ^ : SELECT "users".* FROM "users" WHERE "users"."post_count" = 0 from /var/www/discourse/vendor/bundle/ruby/2.3.0/gems/rack-mini-profiler-0.10.1/lib/patches/db/pg.rb:90:in `exec'

This is not really documented I think but if it is please point me in the right direction?

1 « J'aime »

“post count” != “post_count” ??

My bad, the post_count property was moved to another table for optimization reasons.

Here’s the updated query

User.joins(:user_stat).where("user_stats.post_count = 0").destroy_all
6 « J'aime »

Thank you, the updated query works!

3 « J'aime »

One of my sites uses SSO and we’re looking to remove users that have never posted and haven’t been seen in a year (to avoid killing users who are just quiet). Is this query valid in the rails console?

User.joins(:user_stat).where("user_stats.post_count = 0 AND previous_visit_at <= '2016-05-20'::timestamp").destroy_all
2 « J'aime »

It looks good to me.

1 « J'aime »

J’ai le même problème, mais avec des utilisateurs que je dois supprimer avant de procéder à l’importation finale. J’ai travaillé à créer une configuration de base avec tous les paramètres, thèmes, etc., avant l’importation. Maintenant (après beaucoup de travail), je découvre que j’ai fait cela sur une importation partielle qui avait déjà importé 4 000 utilisateurs.

Je souhaite les supprimer afin que personne ne reçoive accidentellement des e-mails de résumés ou autres (au cas où j’oublierais de modifier ces paramètres).

Comment adapter cette requête pour ne garder que l’utilisateur administrateur ?
Il y a environ 4 000 utilisateurs dans la liste des utilisateurs actifs
et environ 30 dans la liste des utilisateurs suspendus.

Merci d’avance :slight_smile:

Note : De nos jours, il existe une classe spécifique pour détruire proprement les utilisateurs et les enregistrements associés : UserDestroyer.

Donc, au lieu de ceci :

Cela devrait être fait :

destroyer = UserDestroyer.new(Discourse.system_user)
User.joins(:user_stat).where("user_stats.post_count = 0").each { |u| destroyer.destroy(u) }
4 « J'aime »