# 导入 SQLAlchemy 的 Session 类,用于类型提示 from sqlalchemy.orm import Session # 导入地区维度表模型 from model.student_info_region_model import Region_dimension # ==================== 查询地区 ==================== def get_region_part(session: Session, province: str): """ 根据省份查询地区信息。 :param session: 数据库会话 :param province: 省份名称,若为空则查询全部 :return: Region_dimension 对象列表 """ try: # 如果传入了省份(非空),则按省份过滤 if province: data = session.query(Region_dimension).filter( Region_dimension.province == province ).all() else: # 否则查询所有地区 data = session.query(Region_dimension).all() return data except Exception as e: # 出现异常直接向上抛出,由 API 层统一处理 raise e # ==================== 添加地区 ==================== def add_region(session: Session, d1: dict): """ 新增一条地区记录。 :param session: 数据库会话 :param d1: 地区信息字典,需包含 code、province、city、district :return: 成功时返回字符串 '添加成功' """ try: # 先检查该地区编码是否已存在 data = session.query(Region_dimension).filter( Region_dimension.code == d1["code"] ).first() # 如果已存在,抛出 ValueError(注意:这里没有带错误信息,调用方需自行处理) if data: raise ValueError # 根据字典创建 ORM 对象 obj = Region_dimension(**d1) session.add(obj) # 加入会话 session.commit() # 提交事务,写入数据库 session.refresh(obj) # 刷新对象,获取数据库生成的默认值(如自增 id) return '添加成功' except Exception as e: # 出现异常时回滚事务,避免脏数据 session.rollback() raise e # ==================== 修改地区 ==================== def update_region(session: Session, code, d1: dict): """ 根据地区编码更新地区信息(部分字段更新)。 :param session: 数据库会话 :param code: 要修改的地区编码 :param d1: 待更新的字段字典 :return: 成功返回 '修改成功';未找到记录返回 None """ try: # 使用 query.update() 批量更新,返回受影响行数 rows = session.query(Region_dimension).filter( Region_dimension.code == code ).update(d1) # 如果受影响行数为 0,说明编码不存在,无记录可更新 if rows == 0: return None session.commit() return '修改成功' except Exception as e: # 异常时回滚 session.rollback() raise e # ==================== 删除地区 ==================== def delete_region(session: Session, code): """ 根据地区编码删除地区记录(物理删除)。 :param session: 数据库会话 :param code: 要删除的地区编码 :return: 成功返回 '删除成功';未找到记录返回 None """ try: # 使用 query.delete() 物理删除,返回受影响行数 rows = session.query(Region_dimension).filter( Region_dimension.code == code ).delete() # 如果受影响行数为 0,说明编码不存在 if rows == 0: return None session.commit() return '删除成功' except Exception as e: # 异常时回滚 session.rollback() raise e