Files
DoubaoTeam/dao/employment.py
T
2026-09-21 21:29:06 +08:00

166 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 导入sqlalchemy会话对象,数据库会话,所有数据库操作都依靠Session
from sqlalchemy.orm import Session
# 类型提示:可选对象、列表
from typing import Optional, List
# 导入数据库ORM模型
from models.employment import Employment
# 导入pydantic入参模型
from schemas.employment import EmploymentCreate, EmploymentUpdate
def create_employment(db: Session, obj_in: EmploymentCreate) -> Optional[Employment]:
"""
新增就业信息:一个学生只能存在一条就业记录
:param db: 数据库会话对象,由FastAPI依赖注入传入
:param obj_in: 新增的入参对象 EmploymentCreate
:return: 成功返回ORM对象,发生任何异常返回None
"""
try:
# model_dump()把pydantic对象转字典;**解包字典,赋值给Employment模型字段,创建ORM对象
db_obj = Employment(**obj_in.model_dump())
# 将对象加入会话,此时还没有写入数据库
db.add(db_obj)
# 提交事务,真正执行insert SQL写入数据库
db.commit()
# db.refresh:从数据库刷新对象,回填数据库自动生成的id等字段到db_obj
db.refresh(db_obj)
return db_obj
except Exception:
# 只要出现任意异常,执行回滚,撤销本次会话所有未提交操作,防止脏数据残留
db.rollback()
return None
def get_employment_by_id(db: Session, eid: int) -> Optional[Employment]:
"""
根据主键id查询就业详情,过滤逻辑删除的数据
:param db: 数据库会话
:param eid:就业记录主键id
:return:查到返回ORM对象;没找到/异常返回None
"""
try:
# 查询Employment表,条件:id等于eid,并且is_deleted=0(没有被逻辑删除)
return db.query(Employment).filter(
Employment.id == eid,
Employment.is_deleted == 0
).first() # first()获取第一条结果,没有匹配返回None
except Exception:
return None
def get_employment_by_student_id(db: Session, student_id: int) -> Optional[Employment]:
"""
根据学生id查询就业信息,过滤逻辑删除
:param db:数据库会话
:param student_id:学生主键id
:return:查到返回ORM对象,否则None
"""
try:
return db.query(Employment).filter(
Employment.student_id == student_id,
Employment.is_deleted == 0
).first()
except Exception:
return None
def get_employment_list(
db: Session,
company_name: Optional[str] = None,
salary_min: Optional[float] = None,
salary_max: Optional[float] = None,
skip: int = 0,
limit: int = 20
) -> tuple[List[Employment], int]:
"""
就业列表查询;支持公司名模糊、薪资范围筛选;只查询is_deleted=0正常数据
:param db:数据库会话
:param company_name:公司名称,模糊查询,不传不做过滤
:param salary_min:薪资下限,不传不做过滤
:param salary_max:薪资上限,不传不做过滤
:param skip:分页偏移量,跳过多少条
:param limit:分页每页最多取多少条
:return:元组 (记录列表,总条数);异常返回 [],0
"""
try:
# 构建基础查询对象,只查询未被逻辑删除的数据
query = db.query(Employment).filter(Employment.is_deleted == 0)
# 如果传入公司名,增加模糊匹配条件,%代表通配符
if company_name:
query = query.filter(Employment.company_name.like(f"%{company_name}%"))
# 如果传入最低薪资,增加薪资>=下限条件
if salary_min is not None:
query = query.filter(Employment.salary >= salary_min)
# 如果传入最高薪资,增加薪资<=上限条件
if salary_max is not None:
query = query.filter(Employment.salary <= salary_max)
# count()统计符合条件的总记录数,用于前端分页
total = query.count()
# offset跳过skip条,limit最多取limit条,执行查询拿到结果列表
records = query.offset(skip).limit(limit).all()
return records, total
except Exception:
# 异常返回空列表、总条数0
return [], 0
def update_employment(db: Session, eid: int, obj_in: EmploymentUpdate) -> Optional[Employment]:
"""
修改就业信息,只更新前端传入的字段
:param db:数据库会话
:param eid:待修改记录主键id
:param obj_in:修改入参对象 EmploymentUpdate
:return:成功返回更新后的ORM对象;记录不存在/异常返回None
"""
try:
# 先根据id查询这条记录(自动过滤逻辑删除)
db_obj = get_employment_by_id(db, eid)
# 如果记录不存在,直接返回None
if not db_obj:
return None
# exclude_unset=True:只拿到前端实际传过来的字段,没有传的字段不会出现在字典中
update_dict = obj_in.model_dump(exclude_unset=True)
# 循环字典,把每一个key‑value赋值给ORM对象属性
for key, value in update_dict.items():
setattr(db_obj, key, value)
# 提交事务,把修改写入数据库
db.commit()
# 刷新对象,同步数据库最新数据到对象
db.refresh(db_obj)
return db_obj
except Exception:
# 发生异常回滚,放弃修改
db.rollback()
return None
def delete_employment_logic(db: Session, eid: int) -> bool:
"""
逻辑删除,只修改is_deleted=1,**不做物理删除db.delete()**,符合项目文档要求
:param db:数据库会话
:param eid:待删除记录id
:return:成功返回True;记录不存在/异常返回False
"""
try:
# 查询这条记录,过滤已逻辑删除
db_obj = get_employment_by_id(db, eid)
# 记录不存在返回False
if not db_obj:
return False
# 修改逻辑删除标记为1
db_obj.is_deleted = 1
# 提交事务,把修改写入数据库
db.commit()
return True
except Exception:
# 异常回滚,返回False
db.rollback()
return False