Files
DoubaoTeam/dao/class_dao.py
T

83 lines
6.7 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.
# 班级dao模块
from models.class_model import Classes # 从models包里的class_model班级模块导入Classes表模型类
#以下分别定义增、删、改、查的依赖函数,以便api接口函数中执行
# ————定义班级表"新增"信息的函数————
def post_classes_dao( c , db ): # 定义函数,设置两个形参c,db
try : # 执行以下可能报错的代码
cc = Classes( **c ) # 将接口函数接收的字典数据解包,实例化为 Classes 模型对象
db.add( cc ) # 将模型对象加入当前数据库会话(尚未真正写入数据库)
except : # 捕获异常:
db.rollback() # 如果中间出错,回滚事务,防止产生脏数据
return False # 返回 False,返回接口,表示操作失败
else : # 执行成功:
db.commit() # 提交事务:将数据真正持久化写入到数据库中
return True # 返回 True,返回接口,表示操作成功
# ————定义班级表"更新"信息的函数————
def update_classes_dao( class_id , db , updates ): # 定义函数,设置三个形参class_id,db ,updates
try : # 执行以下可能报错的代码
db.query(Classes).filter(Classes.id ==class_id , Classes.is_deleted == 0 ).update(updates) # 将接口函数接收的更新数据更新到Classes模型对象,条件是未删除且前端输入的id和数据库id可以匹配上的
except : # 捕获异常:
db.rollback() # 如果中间出错,回滚事务,防止产生脏数据
return False # 返回 False,返回接口,表示操作失败
else : # 执行成功:
db.commit() # 提交事务:将数据真正持久化写入到数据库中
return True # 返回 True,返回接口,表示操作成功
# ————定义班级表"查询"信息的函数————
from sqlalchemy import func, and_ ,desc # 从sqlalchemy模块导入func聚合函数的类、and_函数,降序排序desc函数
from models.student import Student # 从models包下的student模块导入Student表模型类
def get_classes_dao( class_id, class_no , class_name , page , page_size , db ): # 定义函数,设置六个形参class_id, class_no , class_name , page , page_size , db
q = db.query( Classes.id.label('class_id') # 查询班级ID(别名class_id)
, Classes.class_no # 班级编号
, Classes.class_name # 班级名称
, func.count(Student.id).label('student_count') # 统计班级未删除的学生人数(别名student_count)
, Classes.start_date #开课时间
, Classes.end_date #结课时间
, Classes.created_at #创建时间
, Classes.update_at #更新时间
, Classes.remark #备注信息
). \
outerjoin(Student, and_(Classes.id == Student.class_id, Student.is_deleted == 0)). \
filter( Classes.is_deleted == 0 ) # 左连接学生表,并指定连接条件(未删除的学生)
if class_id : # 如果传入了班级id参数
q = q.filter( Classes.id == class_id ) # 则追加id过滤条件
if class_no : # 如果传入了班级no参数
q = q.filter( Classes.class_no == class_no ) # 则追加no过滤条件
if class_name : # 如果传入了班级name参数
q = q.filter( Classes.class_name == class_name ) # 则追加name过滤条件
q = q.group_by(Classes.id, Classes.class_no, Classes.class_name) # 按班级ID、编号、名称进行分组聚合
q = q.order_by( desc('student_count') ) # 按学生人数(别名)进行降序排列
total = q.count() # total变量接收满足当前所有过滤条件的数据总条数
r = q.offset((page - 1) * page_size).limit(page_size).all() # 变量r用来接收查询取出结果列表,计算分页偏移量(从第几行开始查),设置分页限制条数
return total, [ # 返回 total变量总条数 和 将查询结果列表转换为字典列表的数据
{
'class_id': i.class_id # 提取班级ID
, 'class_no': i.class_no # 提取班级编号
, 'class_name': i.class_name # 提取班级名称
, 'student_count': i.student_count # 提取班级总人数
, 'start_date':i.start_date # 提取开课日期
, 'end_date':i.end_date # 提取结课日期
, 'created_at':i.created_at # 提取创建时间
, 'update_at':i.update_at # 提取更新时间
, 'remark':i.remark # 提取备注信息
}
for i in r # 循环遍历查询出的每一行数据 i
]
# ————定义班级表"删除"信息的函数————
def delete_classes_dao( class_id , db ): # 定义函数,设置两个个形参class_id,db
try : # 执行以下可能报错的代码
db.query( Classes ).filter( Classes.id == class_id , Classes.is_deleted == 0 ).update( {"is_deleted": 1} ) # 将未删除且前端输入的id和数据库id可以匹配上的数据更新is_deleted字段为1,表示已逻辑删除
except : # 捕获异常:
db.rollback() # 如果中间出错,回滚事务,防止产生脏数据
return False # 返回 False,返回接口,表示操作失败
else : # 执行成功:
db.commit() # 提交事务:更新is_deleted字段为1,表示已逻辑删除,前端无法查询到已逻辑删除的数据
return True # 返回 True,返回接口,表示操作成功