成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于 oracle 的 flask 項(xiàng)目(三)——生成報(bào)表

sixgo / 2417人閱讀

摘要:本文主要講解如何生成不同需求的報(bào)表。項(xiàng)目描述第一個(gè)頁面,以和為關(guān)聯(lián),查詢出本月職工的關(guān)聯(lián)客戶及客戶的資產(chǎn)余額。建立上個(gè)月的虛字段。,二是利用函數(shù)來對(duì)初始化數(shù)據(jù)進(jìn)行賦值的操作。提示注意的語法。權(quán)限為的用戶只顯示本人的相關(guān)信息。

曾經(jīng),因?yàn)閷?duì) sqlalchemy 不熟悉,固執(zhí)的拋棄之,直接引入原生的 cx_Oracle 來生成報(bào)表,但是經(jīng)過一堆的“上下文等”錯(cuò)誤后,我幡然悔悟,還是回到了 sqlalchemy 的懷抱來。
認(rèn)真學(xué)習(xí) sqlalchemy,你會(huì)發(fā)現(xiàn)意想不到的驚喜。本文主要講解如何生成不同需求的報(bào)表。
項(xiàng)目描述

第一個(gè)頁面,以 OusiStaff.phone 和 OusiGuest.staff_phone 為關(guān)聯(lián),查詢出本月職工的關(guān)聯(lián)客戶及客戶的資產(chǎn)余額。

第二個(gè)頁面,以 OusiStaff.phone 和 OusiGuest.staff_phone 為關(guān)聯(lián),查詢出每個(gè)職工所有關(guān)聯(lián)的客戶的本月資產(chǎn)、上月資產(chǎn)及本月管戶資產(chǎn)增額。

具有管理員權(quán)限的員工可以看到本部門下面所有員工的相關(guān)信息,非管理員權(quán)限的員工只能查看自己的相關(guān)信息。

查詢功能留給下一章詳細(xì)講解。

建立報(bào)表模板

不在贅述。詳情請(qǐng)下載代碼查看。

實(shí)現(xiàn)第一個(gè)頁面 建立第一個(gè)頁面的試圖函數(shù)

第一個(gè)頁面使用sqlalchemy查詢比較簡(jiǎn)單,關(guān)鍵點(diǎn)是:

區(qū)分權(quán)限。

聯(lián)表查詢。

建立上個(gè)月的虛字段。

分頁顯示。

查詢嵌套。

views.py 內(nèi)容:

@show.route("/01", methods = ["GET", "POST"])
@login_required
def _01():
    g1 = aliased(OusiGuest) # 重復(fù)用到該數(shù)據(jù)庫,需要設(shè)置別名。
    g2 = aliased(OusiGuest) # 重復(fù)用到該數(shù)據(jù)庫,需要設(shè)置別名。
    page = request.args.get("page", 1, type=int) # 分頁
    if current_user.role == "admin": # 區(qū)分權(quán)限
        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)

其實(shí),以上內(nèi)容就是利用 sqlalchemy 的聯(lián)表查詢問題,將 OusiStaff 和 OusiGuest 以 phone 值為關(guān)聯(lián)進(jìn)行查詢,然后將結(jié)果顯示出來。

其中的難點(diǎn)一是利用 func.to_datefunc.add_months 對(duì)上個(gè)月這個(gè)時(shí)間進(jìn)行關(guān)聯(lián)查詢(凡是數(shù)據(jù)庫支持的函數(shù),在 sqlalchemy 中都可以使用 func 加函數(shù)名來操作。),二是利用 func.nvl 函數(shù)來對(duì)初始化數(shù)據(jù)進(jìn)行賦值 0 的操作。 具體的 sqlalchemy 語法,請(qǐng)參見代碼。

提示: 注意 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") ,這語句的主要是為了實(shí)現(xiàn)查詢上個(gè)月的余額,如果查詢不到,通過 oracle 的 nvl 函數(shù)設(shè)置為 0 。
第一個(gè)頁面顯示結(jié)果

權(quán)限為 admin 的用戶顯示本部門下所有員工的相關(guān)信息。

權(quán)限為 general 的用戶只顯示本人的相關(guān)信息。

實(shí)現(xiàn)第二個(gè)頁面 建立第二個(gè)頁面的試圖函數(shù)

第二頁使用 sqlalchemy 查詢稍微復(fù)雜點(diǎn),關(guān)鍵點(diǎn)除了第一個(gè)頁面的要求外還有:

使用 func.sum 對(duì)相關(guān)字段進(jìn)行相加運(yùn)算。

用到了子查詢。

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 里分組查詢的字段。

第二個(gè)頁面顯示結(jié)果

權(quán)限為 admin 的用戶顯示本部門下所有員工的相關(guān)信息。

權(quán)限為 general 的用戶只顯示本人的相關(guān)信息。

源碼下載

下節(jié)更精彩,將實(shí)現(xiàn)搜索查詢功能,又是一堆 sqlalchemy 語句。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41289.html

相關(guān)文章

  • 基于 oracle flask 項(xiàng)目(五)——報(bào)表下載

    摘要:將報(bào)表下載下來,然后能稍許進(jìn)行修飾,這是必須的。項(xiàng)目描述將頁面原始呈現(xiàn)的數(shù)據(jù)及搜索后的數(shù)據(jù)以報(bào)表的形式下載下來。至此,你可以實(shí)驗(yàn)一下,你的項(xiàng)目是否可以實(shí)現(xiàn)報(bào)表下載了。 在國企,很多領(lǐng)導(dǎo)是按部就班的晉升上來的,他們的年齡及經(jīng)歷使他們至今還沒有掌握電腦的基礎(chǔ)知識(shí),因此,紙質(zhì)報(bào)表是他們掌握全局的依據(jù),必備的工具。將報(bào)表下載下來,然后能稍許進(jìn)行修飾,這是必須的。 項(xiàng)目描述 將頁面原始呈現(xiàn)的數(shù)據(jù)...

    klinson 評(píng)論0 收藏0
  • 基于 oracle flask 項(xiàng)目(一)——配置項(xiàng)目

    摘要:一般印象,項(xiàng)目適合做一些短小精悍的項(xiàng)目,特別是與等數(shù)據(jù)庫結(jié)合很是般配。生成報(bào)表,不同的查詢結(jié)果生成不同的報(bào)表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數(shù)據(jù)庫連接池的超時(shí)時(shí)間。 一般印象,flask 項(xiàng)目適合做一些短小精悍的項(xiàng)目,特別是與 sqlite、mysql 等數(shù)據(jù)庫結(jié)合很是般配。但是在一些大公司,特別是一些金融行業(yè)等國企公司,還是以 oracle 居多,那么,這個(gè)小辣...

    xialong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<