117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
from models.student import Student
|
|
from sqlalchemy.orm import Session
|
|
|
|
#新建学生
|
|
def create_students(d: dict, db: Session):
|
|
stu = Student(**d)
|
|
|
|
try:
|
|
db.add(stu)
|
|
# 把 SQL 发给数据库执行
|
|
db.flush()
|
|
# 根据 id 生成学生编号
|
|
if not stu.student_no:
|
|
stu.student_no = f"STU{stu.id:04d}"
|
|
db.commit()
|
|
db.refresh(stu)
|
|
return stu
|
|
except Exception as e:
|
|
db.rollback()
|
|
print(f"插入学生失败: {e}")
|
|
return None
|
|
|
|
#查询学生是否已经被逻辑删除
|
|
def get_student_by_id(student_id: int, db: Session):
|
|
# 同时判断 is_deleted,已经逻辑删除的学生不会被查到
|
|
return db.query(Student).filter(
|
|
Student.id == student_id,
|
|
Student.is_deleted == 0,
|
|
).first()
|
|
|
|
#更新学生信息
|
|
def update_student(student_id: int, data: dict, db: Session):
|
|
# 第一步:先查询学生
|
|
student = get_student_by_id(student_id, db)
|
|
|
|
# 没有查到就返回 None
|
|
if not student:
|
|
return None
|
|
|
|
try:
|
|
# 第二步:循环修改前端传来的字段
|
|
# field 是字段名,value 是新的值
|
|
for field, value in data.items():
|
|
setattr(student, field, value)
|
|
|
|
# 第三步:提交修改并重新读取数据
|
|
db.commit()
|
|
db.refresh(student)
|
|
return student
|
|
|
|
except Exception as e:
|
|
# 修改失败时回滚
|
|
db.rollback()
|
|
print("修改学生失败:", e)
|
|
return False
|
|
|
|
#允许条件输入的列表查询
|
|
def get_students(
|
|
db: Session,
|
|
student_no: str | None = None,
|
|
student_name: str | None = None,
|
|
class_id: int | None = None,
|
|
page: int = 1,
|
|
page_size: int = 10,
|
|
):
|
|
# 第一步:只查询没有被删除的学生
|
|
query = db.query(Student).filter(Student.is_deleted == 0)
|
|
|
|
# 第二步:前端传了哪个条件,就增加哪个条件
|
|
if student_no:
|
|
# 学号使用精确查询
|
|
query = query.filter(Student.student_no == student_no)
|
|
|
|
if student_name:
|
|
# 姓名使用模糊查询,例如“张”可以查到“张三”
|
|
query = query.filter(Student.student_name.like(f"%{student_name}%"))
|
|
|
|
# 班级 ID 使用精确查询
|
|
if class_id is not None:
|
|
query = query.filter(Student.class_id == class_id)
|
|
|
|
# 分页之前统计符合条件的总条数
|
|
total = query.count()
|
|
|
|
#默认按学生id排序
|
|
students = (
|
|
query
|
|
.order_by(Student.id.desc())
|
|
.offset((page - 1) * page_size)
|
|
.limit(page_size)
|
|
.all()
|
|
)
|
|
return total, students
|
|
|
|
#逻辑删除学生
|
|
def delete_student(student_id: int, db: Session):
|
|
# 第一步:查询学生
|
|
student = get_student_by_id(student_id, db)
|
|
|
|
if not student:
|
|
return None
|
|
|
|
try:
|
|
# 第二步:不真正删除记录,只把删除标记改成 1
|
|
student.is_deleted = 1
|
|
|
|
# 第三步:提交修改
|
|
db.commit()
|
|
return student
|
|
|
|
except Exception as e:
|
|
# 删除失败时回滚
|
|
db.rollback()
|
|
print("删除学生失败:", e)
|
|
return False
|
|
|