# student_dao:所有数据库的逻辑 from students.model.students_model import Students from students.schema.students_request import * from fastapi import HTTPException # 查询 def get_student_dao( s , db): q = db.query(Students).filter(Students.is_deleted == False) if s.get('id'): q = q.filter( Students.id == s.get("id") ) if s.get('num'): q = q.filter( Students.num == s.get("num") ) if s.get('name'): q = q.filter( Students.name == s.get("name") ) if s.get('age'): q = q.filter( Students.age == s.get("age") ) if s.get('sex'): q = q.filter( Students.sex == s.get("sex") ) if s.get('home_Place'): q = q.filter( Students.home_Place == s.get("home_Place") ) if s.get('college'): q = q.filter( Students.college == s.get("college") ) if s.get('specialty'): q = q.filter( Students.specialty == s.get("specialty") ) if s.get('enrollment_time'): q = q.filter( Students.enrollment_time == s.get("enrollment_time") ) if s.get('graduate_time'): q = q.filter( Students.graduate_time == s.get("graduate_time") ) if s.get('education'): q = q.filter( Students.education == s.get("education") ) if s.get('class_id'): q = q.filter(Students.class_id == s.get("class_id") ) if s.get('advisor_id'): q = q.filter(Students.advisor_id == s.get("advisor_id") ) if s.get('phone'): q = q.filter(Students.phone == s.get("phone")) s1 = q.all() if s1: return [{ 'id':i.id , 'num':i.num , 'name':i.name , 'age':i.age , 'sex':i.sex , 'home_Place':i.home_Place , 'college':i.college , 'specialty':i.specialty , 'enrollment_time':i.enrollment_time , 'graduate_time':i.graduate_time , 'education':i.education # 外键字段 , 'class_id':i.class_id , 'advisor_id':i.advisor_id # 额外字段 , 'phone':i.phone } for i in s1 ] # 新增 def add_student_dao( s , db): try: phone = s.get("phone") s1_deleted = db.query( Students ).filter( Students.phone == phone ).first() if s1_deleted and s1_deleted.is_deleted == False: return False if not phone: return False if s1_deleted and s1_deleted.is_deleted == True: s1_deleted.name = s.get("name") s1_deleted.age = s.get("age") s1_deleted.sex = s.get("sex") s1_deleted.home_Place = s.get("home_Place") s1_deleted.college = s.get("college") s1_deleted.specialty = s.get("specialty") s1_deleted.enrollment_time = s.get("enrollment_time") s1_deleted.graduate_time = s.get("graduate_time") s1_deleted.education = s.get("education") # 外键字段 s1_deleted.class_id = s.get("class_id") s1_deleted.advisor_id = s.get("advisor_id") # 额外字段 s1_deleted.phone = s.get("phone") s1_deleted.create_date = datetime.now() s1_deleted.update_date = datetime.now() s1_deleted.is_deleted = False s1_deleted.deleted_date = None db.commit() db.refresh(s1_deleted) # 从数据库再拉一次数据 return s1_deleted s1 = Students( **s ) db.add(s1) except Exception: # 这里可以加日志 db.rollback() return False else: db.commit() db.refresh(s1) return s1 # 更新 def update_student_dao( s , db): try: phone = s.get("phone") if phone is not None and phone != '': s1_con = db.query( Students ).filter( Students.phone == phone ,Students.id != s.get("id") ,Students.is_deleted == False ).first() if s1_con: raise HTTPException(status_code=409, detail=f'手机号已被其他学生使用:{phone}') s1_id = db.query( Students ).filter( Students.id == s.get("id") ,Students.is_deleted == False ).first() if not s1_id: raise HTTPException(status_code=404, detail=f'学生不存在:id={s.get("id")}') if s.get("num") is not None: s1_id.name = s.get("num") if s.get("name") is not None: s1_id.name = s.get("name") if s.get("age") is not None: s1_id.age = s.get("age") if s.get("sex") is not None: s1_id.sex = s.get("sex") if s.get("home_Place") is not None: s1_id.home_Place = s.get("home_Place") if s.get("college") is not None: s1_id.college = s.get("college") if s.get("specialty") is not None: s1_id.specialty = s.get("specialty") if s.get("enrollment_time") is not None: s1_id.enrollment_time = s.get("enrollment_time") if s.get("graduate_time") is not None: s1_id.graduate_time = s.get("graduate_time") if s.get("education") is not None: s1_id.education = s.get("education") # 外键字段 if s.get("class_id") is not None: s1_id.class_id = s.get("class_id") if s.get("advisor_id") is not None: s1_id.advisor_id = s.get("advisor_id") # 额外字段 if s.get("phone") is not None: s1_id.student_phone = s.get("phone") except HTTPException: raise except Exception: db.rollback() raise else: s1_id.update_date = datetime.now() db.commit() db.refresh(s1_id) # 从数据库再拉一次数据 return s1_id # 逻辑删除/软删除 def delete_student_dao( s , db): try: if not any([ s.get("id") ,s.get("num") ,s.get("name") ,s.get("age") ,s.get("sex") ,s.get("home_Place") ,s.get("college") ,s.get("specialty") ,s.get("enrollment_time") ,s.get("graduate_time") ,s.get("education") ,s.get("class_id") ,s.get("advisor_id") ,s.get("phone") ]): raise HTTPException(status_code=400, detail="输入需要删除的学生信息,删除条件任选,但不可全为空。") q = db.query(Students).filter(Students.is_deleted == False) if s.get('id'): q = q.filter(Students.id == s.get("id") ) if s.get('num'): q = q.filter(Students.num == s.get("num")) if s.get('name'): q = q.filter(Students.name == s.get("name") ) if s.get('age'): q = q.filter(Students.age == s.get("age") ) if s.get('sex'): q = q.filter(Students.sex == s.get("sex")) if s.get('home_Place'): q = q.filter(Students.home_Place == s.get("home_Place") ) if s.get('college'): q = q.filter(Students.college == s.get("college") ) if s.get('specialty'): q = q.filter(Students.specialty == s.get("specialty")) if s.get('enrollment_time'): q = q.filter(Students.enrollment_time == s.get("enrollment_time") ) if s.get('graduate_time'): q = q.filter(Students.graduate_time == s.get("graduate_time")) if s.get('education'): q = q.filter(Students.education == s.get("education") ) if s.get('class_id'): q = q.filter(Students.class_id == s.get("class_id") ) if s.get('advisor_id'): q = q.filter(Students.advisor_id == s.get("v") ) if s.get("phone"): q = q.filter(Students.phone == s.get("phone") ) s1_delete = q.all() if not s1_delete: raise HTTPException(status_code=404, detail="没有找到该学生。") for i in s1_delete: i.is_deleted = True i.deleted_date = datetime.now() # s2_deleted =[{"id":i.id,"name":i.name,"phone":i.phone}for i in s1_delete] except HTTPException: raise except Exception: db.rollback() raise HTTPException(status_code=500, detail="Internal server error") else: db.commit() return s1_delete