基于 oracle 的 flask 项目(三)——生成报表
曾经,因为对 sqlalchemy 不熟悉,固执的抛弃之,直接引入原生的 cx_Oracle 来生成报表,但是经过一堆的“上下文等”错误后,我幡然悔悟,还是回到了 sqlalchemy 的怀抱来。 项目描述
建立报表模板不在赘述。详情请下载代码查看。 实现第一个页面建立第一个页面的试图函数第一个页面使用sqlalchemy查询比较简单,关键点是:
@show.route('/01',methods = ['GET','POST']) @login_required def _01(): g1 = aliased(OusiGuest) # 重复用到该数据库,需要设置别名。 g2 = aliased(OusiGuest) # 重复用到该数据库,需要设置别名。 page = request.args.get('page',1,type=int) # 分页 if current_user.role == 'admin': # 区分权限 database = db.session.query(OusiStaff.department,OusiStaff.name.label('staff_name'),OusiStaff.phone,OusiStaff.role,g1.name.label('guest_name'),g1.month,g1.balance,func.nvl(db.session.query(g2.balance).filter( g1.name == g2.name,func.to_date(g2.month,'yyyy-mm') == func.add_months( func.to_date(g1.month,'yyyy-mm'),-1) ),0).label('last_balance') ).filter( OusiStaff.phone == g1.staff_phone,current_user.department == OusiStaff.department,g1.month == date.today().strftime('%Y-%m') ).order_by(g1.name).group_by(OusiStaff.department,g1.balance) else: database = db.session.query(OusiStaff.department,func.nvl(db.session.query(g2.balance).filter( g1.name==g2.name,'yyyy-mm')==func.add_months( func.to_date(g1.month,0).label('last_balance') ).filter( OusiStaff.phone==g1.staff_phone,current_user.phone==g1.staff_phone,g1.month==date.today().strftime('%Y-%m') ).order_by(g1.name).group_by(OusiStaff.department,g1.balance) data = database.paginate(page,per_page=current_app.config['OUSI_POSTS_PER_PAGE'],error_out=False) return render_template('show/01.html',data=data) 其实,以上内容就是利用 sqlalchemy 的联表查询问题,将 OusiStaff 和 OusiGuest 以 phone 值为关联进行查询,然后将结果显示出来。 其中的难点一是利用
第一个页面显示结果权限为 admin 的用户显示本部门下所有员工的相关信息。
权限为 general 的用户只显示本人的相关信息。
实现第二个页面建立第二个页面的试图函数第二页使用 sqlalchemy 查询稍微复杂点,关键点除了第一个页面的要求外还有:
@show.route('/02','POST']) @login_required def _02(): page = request.args.get('page',type=int) g1 = aliased(OusiGuest) g2 = aliased(OusiGuest) if current_user.role == 'admin': sbq = db.session.query(OusiStaff.department,g1.staff_phone,func.nvl(db.session.query(g2.balance).filter( g1.name==g2.name,func.add_months(func.to_date(g1.month,-1) == func.to_date(g2.month,'yyyy-mm') ),0).label('last_balance')).filter( OusiStaff.phone==g1.staff_phone,OusiStaff.department==current_user.department ).group_by(OusiStaff.department,g1.balance).subquery() database = db.session.query(sbq.c.department,sbq.c.role,sbq.c.staff_name,sbq.c.staff_phone,sbq.c.month,func.count(sbq.c.guest_name).label('members'),func.sum(sbq.c.balance).label('balance'),func.sum(sbq.c.last_balance).label('last_balance')). filter(sbq.c.month==date.today().strftime('%Y-%m')).group_by(sbq.c.department,sbq.c.month) else: sbq = db.session.query(OusiStaff.department,func.nvl(db.session.query(g2.balance).filter( g1.name == g2.name,'yyyy-mm') ),0).label('last_balance')).filter( OusiStaff.phone == g1.staff_phone,OusiStaff.phone == current_user.phone ).group_by(OusiStaff.department,func.sum(sbq.c.last_balance).label('last_balance')). filter(sbq.c.month == date.today().strftime('%Y-%m')).group_by(sbq.c.department,sbq.c.month) data = database.paginate(page,error_out=False) return render_template('show/02.html',data=data) 注意 query 的字段以及 group_by 里分组查询的字段。 第二个页面显示结果权限为 admin 的用户显示本部门下所有员工的相关信息。
权限为 general 的用户只显示本人的相关信息。
源码下载 下节更精彩,将实现搜索查询功能,又是一堆 sqlalchemy 语句。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |