摘要:本文主要講解如何生成不同需求的報表。項目描述第一個頁面,以和為關聯(lián),查詢出本月職工的關聯(lián)客戶及客戶的資產(chǎn)余額。建立上個月的虛字段。,二是利用函數(shù)來對初始化數(shù)據(jù)進行賦值的操作。提示注意的語法。權限為的用戶只顯示本人的相關信息。
曾經(jīng),因為對 sqlalchemy 不熟悉,固執(zhí)的拋棄之,直接引入原生的 cx_Oracle 來生成報表,但是經(jīng)過一堆的“上下文等”錯誤后,我幡然悔悟,還是回到了 sqlalchemy 的懷抱來。項目描述
認真學習 sqlalchemy,你會發(fā)現(xiàn)意想不到的驚喜。本文主要講解如何生成不同需求的報表。
第一個頁面,以 OusiStaff.phone 和 OusiGuest.staff_phone 為關聯(lián),查詢出本月職工的關聯(lián)客戶及客戶的資產(chǎn)余額。
第二個頁面,以 OusiStaff.phone 和 OusiGuest.staff_phone 為關聯(lián),查詢出每個職工所有關聯(lián)的客戶的本月資產(chǎn)、上月資產(chǎn)及本月管戶資產(chǎn)增額。
具有管理員權限的員工可以看到本部門下面所有員工的相關信息,非管理員權限的員工只能查看自己的相關信息。
查詢功能留給下一章詳細講解。
建立報表模板不在贅述。詳情請下載代碼查看。
實現(xiàn)第一個頁面 建立第一個頁面的試圖函數(shù)第一個頁面使用sqlalchemy查詢比較簡單,關鍵點是:
區(qū)分權限。
聯(lián)表查詢。
建立上個月的虛字段。
分頁顯示。
查詢嵌套。
views.py 內(nèi)容:
@show.route("/01", methods = ["GET", "POST"]) @login_required def _01(): g1 = aliased(OusiGuest) # 重復用到該數(shù)據(jù)庫,需要設置別名。 g2 = aliased(OusiGuest) # 重復用到該數(shù)據(jù)庫,需要設置別名。 page = request.args.get("page", 1, type=int) # 分頁 if current_user.role == "admin": # 區(qū)分權限 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, OusiStaff.name.label("staff_name"), OusiStaff.phone, OusiStaff.role, g1.name.label("guest_name"), g1.month, g1.balance) else: 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.phone==g1.staff_phone, g1.month==date.today().strftime("%Y-%m") ).order_by(g1.name).group_by(OusiStaff.department, OusiStaff.name.label("staff_name"), OusiStaff.phone, OusiStaff.role, g1.name.label("guest_name"), g1.month, 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)
其實,以上內(nèi)容就是利用 sqlalchemy 的聯(lián)表查詢問題,將 OusiStaff 和 OusiGuest 以 phone 值為關聯(lián)進行查詢,然后將結果顯示出來。
其中的難點一是利用 func.to_date 和 func.add_months 對上個月這個時間進行關聯(lián)查詢(凡是數(shù)據(jù)庫支持的函數(shù),在 sqlalchemy 中都可以使用 func 加函數(shù)名來操作。),二是利用 func.nvl 函數(shù)來對初始化數(shù)據(jù)進行賦值 0 的操作。 具體的 sqlalchemy 語法,請參見代碼。
提示: 注意 sqlalchemy 的語法。 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") ,這語句的主要是為了實現(xiàn)查詢上個月的余額,如果查詢不到,通過 oracle 的 nvl 函數(shù)設置為 0 。第一個頁面顯示結果
權限為 admin 的用戶顯示本部門下所有員工的相關信息。
權限為 general 的用戶只顯示本人的相關信息。
實現(xiàn)第二個頁面 建立第二個頁面的試圖函數(shù)第二頁使用 sqlalchemy 查詢稍微復雜點,關鍵點除了第一個頁面的要求外還有:
使用 func.sum 對相關字段進行相加運算。
用到了子查詢。
views.py 內(nèi)容:
@show.route("/02", methods = ["GET", "POST"]) @login_required def _02(): page = request.args.get("page", 1, type=int) g1 = aliased(OusiGuest) g2 = aliased(OusiGuest) if current_user.role == "admin": sbq = db.session.query(OusiStaff.department, OusiStaff.role, OusiStaff.name.label("staff_name"), g1.staff_phone, g1.name.label("guest_name"), g1.month, g1.balance, func.nvl(db.session.query(g2.balance).filter( g1.name==g2.name, func.add_months(func.to_date(g1.month, "yyyy-mm"), -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, OusiStaff.role, OusiStaff.name.label("staff_name"), g1.staff_phone, g1.name.label("guest_name"), g1.month, 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.role, sbq.c.staff_name, sbq.c.staff_phone, sbq.c.month) else: sbq = db.session.query(OusiStaff.department, OusiStaff.role, OusiStaff.name.label("staff_name"), g1.staff_phone, g1.name.label("guest_name"), g1.month, g1.balance, func.nvl(db.session.query(g2.balance).filter( g1.name == g2.name, func.add_months(func.to_date(g1.month, "yyyy-mm"), -1) == func.to_date(g2.month, "yyyy-mm") ), 0).label("last_balance")).filter( OusiStaff.phone == g1.staff_phone, OusiStaff.phone == current_user.phone ).group_by(OusiStaff.department, OusiStaff.role, OusiStaff.name.label("staff_name"), g1.staff_phone, g1.name.label("guest_name"), g1.month, 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.role, sbq.c.staff_name, sbq.c.staff_phone, sbq.c.month) data = database.paginate(page, per_page=current_app.config["OUSI_POSTS_PER_PAGE"], error_out=False) return render_template("show/02.html", data=data)
注意 query 的字段以及 group_by 里分組查詢的字段。
第二個頁面顯示結果權限為 admin 的用戶顯示本部門下所有員工的相關信息。
權限為 general 的用戶只顯示本人的相關信息。
源碼下載
下節(jié)更精彩,將實現(xiàn)搜索查詢功能,又是一堆 sqlalchemy 語句。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/41289.html
摘要:將報表下載下來,然后能稍許進行修飾,這是必須的。項目描述將頁面原始呈現(xiàn)的數(shù)據(jù)及搜索后的數(shù)據(jù)以報表的形式下載下來。至此,你可以實驗一下,你的項目是否可以實現(xiàn)報表下載了。 在國企,很多領導是按部就班的晉升上來的,他們的年齡及經(jīng)歷使他們至今還沒有掌握電腦的基礎知識,因此,紙質(zhì)報表是他們掌握全局的依據(jù),必備的工具。將報表下載下來,然后能稍許進行修飾,這是必須的。 項目描述 將頁面原始呈現(xiàn)的數(shù)據(jù)...
摘要:一般印象,項目適合做一些短小精悍的項目,特別是與等數(shù)據(jù)庫結合很是般配。生成報表,不同的查詢結果生成不同的報表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數(shù)據(jù)庫連接池的超時時間。 一般印象,flask 項目適合做一些短小精悍的項目,特別是與 sqlite、mysql 等數(shù)據(jù)庫結合很是般配。但是在一些大公司,特別是一些金融行業(yè)等國企公司,還是以 oracle 居多,那么,這個小辣...
閱讀 2252·2021-11-24 09:38
閱讀 3334·2021-11-08 13:27
閱讀 3153·2021-09-10 10:51
閱讀 3276·2019-08-29 12:20
閱讀 730·2019-08-28 18:28
閱讀 3519·2019-08-26 11:53
閱讀 2778·2019-08-26 11:46
閱讀 1588·2019-08-26 10:56