如何删除具有指定角色的所有用户
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
)
其中:
- 确保只return那些
User
具有给定角色 的人
- 确保排除具有其他角色的
User
(这是您尝试用 func.count
解决的问题)
- 这是您遇到的错误的解决方案。
这些是我的用户模型和角色模型:
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
)
其中:
- 确保只return那些
User
具有给定角色 的人
- 确保排除具有其他角色的
User
(这是您尝试用func.count
解决的问题) - 这是您遇到的错误的解决方案。