def update(self,
            old_name: str,
            *,
            new_name: str = None,
            new_password: str = None,
            new_identity: str = None):
     logging.info(
         f'prepare to update user {old_name}, new information {new_name, new_password, new_identity}'
     )
     if all(map(lambda x: x is None,
                [new_name, new_password, new_identity])):
         return
     session = Session()
     query = session.query(Users).filter(Users.name == old_name)
     try:
         user = query.one()  # NoResultFound
         self.update_name(user, new_name)
         self.update_password(user, new_password)
         self.update_identity(user, new_identity)
         session.commit()
         logging.info(f'old user {old_name} has been updated')
     except NoResultFound:
         logging.info(f'user {old_name} does not exist')
         raise UserDoesNotExistError(f'用户 {old_name} 不存在')
     except IntegrityError as e:
         logging.info(
             f'database IntegrityError, error code {e.orig.args[0]}')
         session.rollback()
         if e.orig.args[0] == 1452:
             raise IdentityDoesNotExistError(f'新用户身份 {new_identity} 不存在')
         else:
             assert e.orig.args[0] == 1062
             raise UserExistError(f'新用户名 {new_name} 已存在,无法进行更新')
     finally:
         session.close()
 def delete_single(self, name: str):
     logging.info(f'user {name} prepare to be deleted')
     session = Session()
     query = session.query(Users).filter(Users.name == name)
     try:
         user = query.one()
         session.delete(user)
         session.commit()
         logging.info(f'user {name} has been deleted')
     except NoResultFound:
         session.rollback()
         logging.info(f'fail to delete user {name}')
         raise UserDoesNotExistError(f'用户 {name} 不存在')
     finally:
         session.close()
 def delete_set(self, name_set: set):
     # 避免对容器类型数据直接操作
     internal_name_set = copy.copy(name_set)
     logging.info(f'these users {internal_name_set} prepare to be deleted')
     session = Session()
     query = session.query(Users).filter(Users.name.in_(internal_name_set))
     try:
         users = query.all()
         for user in users:
             internal_name_set.remove(user.name)
             session.delete(user)
         if len(internal_name_set) != 0:
             session.rollback()
             logging.info(f'these users {internal_name_set} do not exist, transaction has rolled back')
             raise UserDoesNotExistError(f'这些用户不存在 {internal_name_set}')
         session.commit()
         logging.info(f'all users have been deleted')
     finally:
         # 关闭会话
         session.close()
    def register_user(self, name: str, password: str, identity: str) -> bool:
        # 会话工厂生产一个具体会话
        session = Session()
        sha1_password = sha1_encrypt(password)
        new_user = Users(name=name,
                         password=sha1_password,
                         remote_identity=identity)
        result = False
        try:
            # 添加记录
            session.add(new_user)
            # 提交事务
            session.commit()
            result = True
        except Exception as e:
            session.rollback()
            logging.info(f'add user {name} failure -> {e}')
        finally:
            # 关闭会话
            session.close()

        return result