如何删除具有指定角色的所有用户

How to delete all users with specified role

这些是我的用户模型和角色模型:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    firstname = db.Column(db.String(100), nullable=False, server_default='')
    lastname = db.Column(db.String(100), nullable=False, server_default='')
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=False)
    answers = db.relationship('Answer', backref="examinee", lazy=True)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)
    active = db.Column('is_active', db.Boolean(), nullable=False, server_default='0')
    roles = db.relationship('Role', secondary='user_roles', backref=db.backref('users', lazy='dynamic'))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True)
    description = db.Column(db.String(255))

class UserRoles(db.Model):
    id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
    UniqueConstraint('user_id', 'role_id', name='user_role_uniqueness')

如何删除具有特定角色的所有用户,例如 'student'?

我尝试了以下无效的片段:

@app.route('/removeAllStudentUsers', methods=['GET', 'POST'])
def remove_all_student_users():
    default_role_name = "student"
    default_role = Role.query.filter(Role.name == default_role_name).first()
    User.query.filter().delete(and_(User.roles.contains(default_role), func.count(User.roles) == 1)) # this line causes the error
    db.session.commit()
    return redirect(url_for('users'))

以上代码导致此错误:

sqlalchemy.exc.ArgumentError:会话同步的有效策略是 'evaluate'、'fetch'、False

您尝试实现该目标时存在多个问题,包括您可能需要一个分组依据来检查角色的数量。

我将执行以下操作:

_ = (
    User.query
    .filter(User.roles.any(Role.name == default_role_name))   # 1
    .filter(~User.roles.any(Role.name != default_role_name))  # 2
    .delete(synchronize_session=False)  # 3
)

其中:

  1. 确保只return那些User具有给定角色
  2. 的人
  3. 确保排除具有其他角色的 User(这是您尝试用 func.count 解决的问题)
  4. 这是您遇到的错误的解决方案。