曾经,因为对 sqlalchemy 不熟悉,固执的抛弃之,直接引入原生的 cx_Oracle 来生成报表,但是经过一堆的“上下文等”错误后,我幡然悔悟,还是回到了 sqlalchemy 的怀抱来。
认真学习 sqlalchemy,你会发现意想不到的惊喜。本文主要讲解如何生成不同需求的报表。
项目描述
- 第一个页面,以 OusiStaff.phone 和 OusiGuest.staff_phone 为关联,查询出本月职工的关联客户及客户的本月及上月资产余额。
- 第二个页面,以 OusiStaff.phone 和 OusiGuest.staff_phone 为关联,查询出每个职工所有关联的客户的本月资产、上月资产及本月管户资产增额。
- 具有管理员权限的员工可以看到本部门下面所有员工的相关信息,非管理员权限的员工只能查看自己的相关信息。
- 查询功能留给下一章详细讲解。
建立报表模板
不在赘述。详情请下载代码查看。
实现第一个页面
建立第一个页面的试图函数
第一个页面使用sqlalchemy查询比较简单,关键点是:
- 区分权限。
- 联表查询。
- 建立上个月的虚字段。
- 分页显示。
- 查询嵌套。
views.py
内容:
@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(
OusiStaf